🚀桥接模式(抽象与实现分离)
1.1⭐桥接模式的定义
维基百科:桥接模式是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。
百度百科:桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(interface)模式。
1.2☘️桥接模式的结构
桥接(Bridge)模式包含以下主要角色:
- 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。
1.3🚀桥接模式简单案例及代码演示
**举个🌰:**假设有一个歌手,他的名字叫磊磊。磊磊会用嘴唱歌,磊磊会边弹吉他边唱歌。但是磊磊是个十分好学的孩子不满足于现状,于是他报了个机构叫白马教育,并且成为了Good Singer班中的一员。在进行了长达两年半的学习之后,磊磊凭借着过人的天赋学会了边弹钢琴边唱歌。
如何实现???
a.传统思路:
定义一个演员类,将用嘴唱歌,用吉他唱歌,用钢琴唱歌写到这个类中。
缺点很明显,如果又来了一个人怎么办,如果又学会的一个乐器怎么办,显然不易扩展。
b.桥接模式思路:
在抽象类中:
将需要桥接的接口拿到父类里
直接将接口属性丢到构造方法里,同时要在子类构造该方法
调用桥接属性开始“表演”
代码演示:
定义抽象演员类(Perfomer)
package com.qf.bridge;public abstract class Perfomer{ //桥接属性 protected IplayType playType; //构造表演方法 public Perfomer(IplayType playType){ this.playType=playType; } //表演 abstract protected void perform();}
定义磊磊类,继承抽象演员类
package com.qf.bridge;public class Leilei extends Perfomer{ //构造方法传递需要的乐器表演方式 public Leilei(IplayType playType) { super(playType); } @Override protected void perform() { playType.play("磊磊"); }}
设计乐器表演接口,包含一个play方法
package com.qf.bridge;//表演方式public interface IplayType{ void play(String name);}
定义吉他表演类遵从乐器表演接口
package com.qf.bridge;public class Guitar implements IplayType { @Override public void play(String name) { System.out.println(name+"用吉他唱歌了"); }}
定义嘴巴类遵从乐器表演类
package com.qf.bridge;public class Mouth implements IplayType{ @Override public void play(String name) { System.out.println(name+"用嘴唱歌了"); }}
Test
package com.qf.bridge;public class Demo1 { public static void main(String[] args) { Perfomer mouth = new Leilei(new Mouth()); mouth.perform(); Perfomer guitar = new Leilei(new Guitar()); guitar.perform(); }}
结果展示:
1.4🚀桥接模式的UML图
稍作解释:
+表示public,-表示private,#表示protected
聚合关系可以用【带空心菱形的实线】来表示,菱形指向整体。(如:teacher是university的一个部分)
继承关系用【带空心三角箭头的实线】来表示,箭头从子类指向父类。
虚假的UML图:
真正的UML图:
1.5🌟桥接模式的应用场景
跨平台视频播放器,可以在不同操作系统平台(如Windows、Mac、Linux等)上播放多种格式的视频文件,常见的视频格式包括RMVB、AVI、WMV等
1.6☘️桥接模式的优缺点
优点:
-
分离抽象接口及其实现部分。使得抽象和实现可以沿着各自的维度来变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。
-
在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法,它极大减少了子类的个数。
多继承是指一个类可以同时从多个父类继承属性和方法。这种继承方式可以让子类同时拥有多个父类的特征,但也可能带来一些问题,比如构造函数的执行顺序和类中同名变量冲突等
-
桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合“开闭原则”。
缺点:
- 桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累。
1.7🚀桥接模式与其他模式的区别
桥接模式与策略模式的区别
桥接模式中不仅Implementor具有变化 ,而且Abstraction也可以发生变化,而且两者的变化是完全独立的
策略模式仅仅通过Abstraction与 Implementor之间的关系联系起来。而在策略模式中,并不考虑Context的变化,只有算法的可替代性。
策略模式的目的是封装一系列的算法,使得这些算法可以相互替换;而桥接模式的目的是分离抽象和实现部分,使得它们可以独立的变化。
前面的路以后再来探索吧……………………….
来源地址:https://blog.csdn.net/qq_45944185/article/details/129484944