定义(百度百科):
将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
UML类图:
具体的代码:
public class Client { @Test public void testBridge() { Implementor impl = new ConcreteImplementor(); Abstraction refinedAbstraction = new RefinedAbstraction(); refinedAbstraction.setImpl(impl); refinedAbstraction.operation(); } } public abstract class Abstraction { protected Implementor impl; public void setImpl(Implementor impl) { this.impl=impl; } public abstract void operation(); } public class RefinedAbstraction extends Abstraction { @Override public void operation() { impl.operation(); } } public interface Implementor { void operation(); } public class ConcreteImplementor implements Implementor { @Override public void operation() { System.out.println("实际应用"); } }
模块说明:
Abstraction:定义抽象类的接口。
维护一个指向Implementor类型对象的引用。
RefinedAbstraction:
扩充由Abstraction定义的接口。
Implementor:
定义实现类的接口,该接口不一定要与Abstraction的接口完全一致,事实上这两个
接口可以完全不同。一般来讲, Implementor接口仅提供基本操作,而Abstraction则
定义了基于这些基本操作的较高层次的操作。
ConcreteImplementor:
实现Implementor接口并定义它的具体实现。
具体例子:
网络上有个例子我觉得很不错,分享到这里,画画可以选择蜡笔和毛笔,如果每种笔分为大中小三个型号,并且有12种颜色
那达到同样的需求,蜡笔的话就是12颜色*3种型号,36支笔,毛笔需要12个染色盒和3支不同型号的毛笔,共15只笔,
如果哪天需要新增一种型号的笔,超大号,那蜡笔需要新增12支,毛笔只需要新增1支。
多维度变化,这样的例子桥接模式就很合适了。
应用场景:
引用《研磨设计模式》这本书的一张图如下
优缺点:
优点:
分离抽象和实现部分(面向抽象编程)
更有效减少类的个数,更好的扩展性(就像上面的例子,新增一种型号的笔就可以了)
缺点:
桥接模式,会增加系统设计的难度,并且对抽象要求很高。
桥接模式要求正确识别出两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也是不易的
总结:桥接的本质就是,区分维度的分离抽象和实现。