前言
这是一篇学习笔记,内容很多是来源于网上的资料,然后按照自己学习情况进行的总结,有些是自身的感受,有些是网上比较好的资料的引用。
如果有人看到我写的笔记有不对的地方欢迎留言指出来,是真的欢迎指出来,因为我可能会错很久,然后才发现。学习技术不能闭门造车,要多交流,多讨论,多思考才能成长的快,学的快。
我的个人博客:海加尔金鹰
什么是桥接模式?
桥接模式的定义与用意
桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
桥接模式的用意 :
抽象化
将不同事物当中抽取出共同的特性的过程就是抽象化的过程。例如西瓜、香蕉、梨、 葡萄等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象化的过程。通常情况下,一组对象如果具有相同的特征,那么它们就可以通过一个共同的类来描述。如果一些类具有相同的特征,往往可以通过一个共同的抽象类来描述。
实现化
抽象化给出的具体实现,就是实现化。
什么是耦合
所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。
所谓强关联,就是在编译时期已经确定的,无法在运行时期动态改变的关联;所谓弱关联,就是可以动态地确定并且可以在运行时期动态地改变的关联。在Java语言中,继承关系是强关联,而聚合关系是弱关联。将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。
因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。1^
桥接模式的适用场景
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
桥接模式的结构与角色
graph LR
A[抽象化角色] -- 持有 --> B((实现化角色))
B -- 被实现 -->D[具体实现化角色 A]
B -- 被实现 -->E[具体实现化角色B]
A -- 被扩展 -->C[扩展抽象化角色A]
A -- 被扩展 -->F[扩展抽象化角色B]
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
桥接模式的核心代码
抽象化类:包含实现化的引用,调用实现化的具体实现
public abstract class Abstraction {
protected Implementor impl;
public Abstraction(Implementor impl){
this.impl = impl;
}
public void operation(){
//调用实现化的具体实现 以及做一些其他操作
impl.operationImpl();
}
}
扩展抽象化角色
public class RefinedAbstractionA extends Abstraction{
public RefinedAbstractionA(Implementor impl) {
super(impl);
}
//扩展类需要实现的业务
public void otherOperation(){
System.out.println("小明吃完饭要干嘛?");
}
}
实现化角色
public interface Implementor {
/**
*实现抽象部分的具体业务操作
*/
public abstract void operationImpl();
}
具体实现角色
public class ConcreteImplementorA implements Implementor {
@Override
public void operationImpl() {
operation();
System.out.println("实现类A的具体操作:吃完饭,去玩游戏");
}
}
public class ConcreteImplementorB implements Implementor {
@Override
public void operationImpl() {
operation();
System.out.println("实现类B的具体操作:吃完饭,去打篮球");
}
}
场景实例代码
资料里面写的很详细,我也是照着这个资料敲的一边代码然后慢慢理解的。
见资料:https://www.cnblogs.com/betterboyz/p/9361784.html
桥接模式总结
个人感觉桥接模式与其说是将抽象和实现分隔开来,还不如说是将不同的抽象和实现进行连接,产生不同的业务。
算是单一职责原则的一种体现吧。只负责抽象或者只负责实现。