Bridge Mode
又称为柄体模式或接口模式
桥梁模式含有2个等级结构
1 由抽象化角色和修正抽象化角色组成的抽象化等级结构
2 由实现化角色和两个具体实现化角色所组成的实现化等级结构
桥梁模式设计的角色:
●抽象化角色:抽象化给出的定义,并保存一个对实现化对象的引用
●修正抽象化角色:扩展抽象化角色,改变和修正父类对抽象化的实现
●实现化角色:给出实现化角色的接口
●具体实现化角色:给出实现化角色对象接口的具体实现
依旧懒人盗图:
书上草草扫了一遍概念,完全没有弄明白他在讲的是什么东西,于是上网找相关的资料,这才有点眉目。
同样参照网上,采用画图的例子来说明桥梁模式是如何作用的
对照着上面的类图
Shape为抽象化角色,其中只有一个待实现的draw方法
public interface Shape { void draw(); }
Circle和Square为Shape的实现,其中接收一个Drawing对象,决定采用何种绘图方式
public class Circle implements Shape{ private Drawing drawing; public Circle(Drawing drawing){ this.drawing=drawing; } public void draw() { System.out.println("Draw Circle"); drawing.drawCircle(); } }
public class Square implements Shape{ private Drawing drawing; public Square(Drawing drawing){ this.drawing=drawing; } public void draw() { System.out.println("Draw Square"); drawing.drawSquare(); } }
Drawing为实现化角色,提供了不同画法的接口
public interface Drawing { void drawCircle(); void drawSquare(); }
Drawing1和Drawing2就是两种具体画法的实现
public class Drawing1 implements Drawing{ public void drawCircle() { System.out.println("Drawing1_circle"); } public void drawSquare() { System.out.println("Drawing1_square"); } }
public class Drawing2 implements Drawing{ public void drawCircle() { System.out.println("Drawing2_circle"); } public void drawSquare() { System.out.println("Drawing2_square"); } }
最终可以灵活的构建不同的绘图组合
public class BridgePattern { public static void main(String[] args) { Shape circle=new Circle(new Drawing1()); Shape circle2=new Circle(new Drawing2()); Shape square=new Square(new Drawing1()); Shape square2=new Square(new Drawing2()); circle.draw(); square.draw(); circle2.draw(); square2.draw(); } }
最终可以得到输出结果:
Draw Circle
Drawing1_circle
Draw Square
Drawing1_square
Draw Circle
Drawing2_circle
Draw Square
Drawing2_square
使用桥梁模式的时机:
●一个系统需要在构件的抽象化角色和具体化角色之间增加灵活性,避免2个层次之间建立的静态联系
●设计要求实现化角色的任何改变不影响客户端
●一个构件有多于一个的抽象化角色和实现化角色,需要动态耦合
●抽象化角色和具体化角色需要独立变化
当只有一个具体实现化角色的情况下,抽象的实现化角色可以被取消,也就是退化的桥梁模式
参考资料链接:
http://www.iteye.com/topic/57178 其中还有对于JDBC,Hibernate的Dao的类比,非常生动
http://www.iteye.com/topic/137469 另外一篇桥梁模式的文章