1、概念准备设计模式
在理解桥接模式以前,先要理解面向对象程序设计中的两个概念:ide
2、模式说明测试
若是类的设计都只有一层(程序中自定义的类不存在继承关系),这时候类的功能层次结构和实现层次结构是混杂在一块儿的,也很难扩展(没法肯定应该继承哪一个类来扩展功能,同一个方法若是想替换其实现也没法作到)。所以须要按照上面说的,将类的功能层次和实现层次分开,为了在分开后能继续保持必定的联系,这时候就须要一个桥梁,将它们链接起来。(Bridge也有桥梁的意思,链接两个事物)this
3、代码示例spa
在下面的桥接模式代码示例中,着重关注哪些时功能层次,哪些是实现层次,两者又是如何桥接起来的。设计
一、类的功能层次结构code
Display类:Display类的功能是抽象的,负责“显示”一些东西,它位于功能层次结构的最上层。open、print、close这三个方法是Display类提供的接口,它们定义了显示的步骤,这三个方法调用的是Display实现类的对象。对象
package com.designpattern.cn.bridgepattern; public class Display { private DisplayImpl impl; public Display(DisplayImpl impl){ this.impl = impl; } public void open(){ impl.rawOpen(); } public void print(){ impl.rawPrint(); } public void close(){ impl.rawClose(); } public final void display(){ open(); print(); close(); } }
CountDisplay类:CountDisplay类在Display类的基础上增长了一个新功能,具备“只显示规定次数”的功能。所以,这属于“类的功能层次范畴”。blog
package com.designpattern.cn.bridgepattern; public class CountDisplay extends Display { public CountDisplay(DisplayImpl impl){ super(impl); } public void multiDisplay(int times){ open(); for(int i=0; i < times; i++){ print(); } close(); } }
二、类的实现层次结构继承
DisplayImpl类:位于“类的实现层次结构”的最上层。DisplayImpl是抽象类,声明了rawOpen、rawPrint、rawClose三个抽象方法。
package com.designpattern.cn.bridgepattern; public abstract class DisplayImpl { public abstract void rawOpen(); public abstract void rawPrint(); public abstract void rawClose(); }
StringDisplayImpl类:它是仙子字符串的类,但它并非直接显示字符串,而是继承了DisplayImpl类,做为子类来使用rawOpen、rawPrint、rawClose三个方法显示字符串。
package com.designpattern.cn.bridgepattern; public class StringDisplayImpl extends DisplayImpl { private String string; private int width; public StringDisplayImpl(String string){ this.string = string; this.width = string.getBytes().length; } @Override public void rawOpen(){ printLine(); } @Override public void rawPrint(){ System.out.println("|" + string + "|"); } @Override public void rawClose() { printLine(); } private void printLine(){ System.out.print("+"); for(int i = 0; i < width; i++){ System.out.println("-"); } System.out.println("+"); } }
三、Main类测试结果
4、模式类图
5、模式中的角色
那么,这其中的桥梁Bridge是什么呢?对于示例程序,Display类和DisplayImpl是如何关联的,从程序中看出,这里的桥梁应该是impl字段。
6、相关的设计模式
7、扩展