GOF对桥接模式(Bridge)的定义是:将抽象部分和它的实现部分分离,使它们可以独立地变化。这里需要记录一些概念,参考自《Java与模式》一书:
抽象化:存在于多个实体中的共同的概念性联系,例如:一组对象如果有相同的概念性联系,则可以用一个共同的类加以描述;如果一些类有相同的概念性联系,则可以用一个抽象类加以描述。
实现化:就是给出抽象化的具体实现,例如:一个对象是一个类的实现化;一个具体类可以是一个抽象类的实现化。
脱耦:耦合是两个实体具有某种强关联关系,将这种强关联关系去掉就是解耦的过程。所谓强关联是在编译时期就已经确定好了关系,例如:继承就是一种强关联关系;而弱关联关系则是在运行期间可以动态地改变关联状态,类的组合关系就是一种若关联关系,这在Java编程中是最常用的一种关系。
理解GOF所下定义的关键是搞明白“抽象” 和“实现”的含义,这里的抽象说白了就是指一个类及其子类,而“实现”是抽象类及其子类实现自己所用的对象,这句话用汉语说比较困难,请看《Design Patterns Explained》作者的表述:Implementations here means the objects that the abstract class and its derivations use to implement themselves with,这就是“实现” 的含义。比如:有一个图形的抽象类Shape,Shape有相应的子类,比如Rectange类,要实现一个Rectange对象,当然需要Draw方法,如果将Draw方法定义到Shape类中,那么每个继承自Shape类的子类都要自定义自己的Draw()方法,岂不是很麻烦,但是,如果将Draw()方法提炼出来单独放到一个类中(也就是Implementor)中,然后让Shape子类去调用对应的Draw()方法岂不是更妙,这样添加Shape子类就不用再在自己的类中添加Draw()方法了,而是调用相应的ConcreteImplementor中的Draw()方法,下面第一个图是Bridge模式的结构图,第二个图是《Design Patterns Explained》一书中所举画图例子的Bridge模式设计图
图1. Bridge模式结构图
图2. Bridge模式画图设计图
画图举例代码如下:
abstract class Shape{ private Drawing drawing; public Shape(Drawing drawing){ this.drawing=drawing; } public void Draw(){ drawing.drawLine(); } } class Rectange extends Shape{ public Rectange(Drawing drawing){ super(drawing); } } abstract class Drawing{ public void drawLine(){}; public void drawCircle(){}; } class V1Drawing extends Drawing{ public void drawLine(){ System.out.println("Drawing Lines"); } public void drawCircle(){ System.out.println("Drawing Circles"); } }
《Java与模式》一书还举例一个应用的例子,就是JDBC驱动器的实现利用的是桥梁模式