简介
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。其构成如下:
- 抽象化角色(Abstraction):抽象化给出的定义,并保存一个对实现化对象的引用。
- 修正抽象化角色(RefineAbstraction):拓展抽象化角色,改变和修正父类对抽象化的定义。
- 实现化角色(Implementor):这个角色给出实现化角色的接口,但是不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
- 具体实现化角色(ConcreteImplementor):这个角色给出实现化角色接口的具体实现
类图
代码
/** * 数据线 * 抽象化角色(Abstraction):抽象化给出的定义,并保存一个对实现化对象的引用 * @author: 张彬 * @date: 2018年5月16日 上午11:38:47 * @version: V1.0 * @review: 张彬/2018年5月16日 上午11:38:47 */ public abstract class DataWire { protected Computer computer; public DataWire(Computer computer){ this.computer = computer; } public abstract void sendData(); }
/** * 手机 * 修正抽象化角色(RefineAbstraction):拓展抽象化角色,改变和修正父类对抽象化的定义。 * @author: 张彬 * @date: 2018年5月16日 上午11:44:19 * @version: V1.0 * @review: 张彬/2018年5月16日 上午11:44:19 */ public class HuaWei extends DataWire{ public HuaWei(Computer computer) { super(computer); } @Override public void sendData() { System.out.println("hw手机发送数据"); computer.receiveData(); } }
/** * 手机 * 修正抽象化角色(RefineAbstraction):拓展抽象化角色,改变和修正父类对抽象化的定义。 * @author: 张彬 * @date: 2018年5月16日 上午11:44:19 * @version: V1.0 * @review: 张彬/2018年5月16日 上午11:44:19 */ public class XiaoMi extends DataWire{ public XiaoMi(Computer computer) { super(computer); } @Override public void sendData() { System.out.println("xm手机发送数据"); computer.receiveData(); } }
/** * 电脑 * 实现化角色(Implementor) * 这个角色给出实现化角色的接口,但是不给出具体的实现。 * 必须指出的是,这个接口不一定和抽象化角色的定义相同,实际上,这两个接口可以非常不一样。 * 实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。 * @author: 张彬 * @date: 2018年5月16日 上午11:33:48 * @version: V1.0 * @review: 张彬/2018年5月16日 上午11:33:48 */ public interface Computer { public void receiveData(); }
/** * 具体实现化角色(ConcreteImplementor):这个角色给出实现化角色接口的具体实现。 * @author: 张彬 * @date: 2018年5月16日 上午11:46:14 * @version: V1.0 * @review: 张彬/2018年5月16日 上午11:46:14 */ public class Mac implements Computer{ @Override public void receiveData() { System.out.println("mac接受数据"); } }
/** * 具体实现化角色(ConcreteImplementor):这个角色给出实现化角色接口的具体实现。 * @author: 张彬 * @date: 2018年5月16日 上午11:46:14 * @version: V1.0 * @review: 张彬/2018年5月16日 上午11:46:14 */ public class Windows implements Computer{ @Override public void receiveData() { System.out.println("windows接受数据"); } }
/** * 客户端 * @author: 张彬 * @date: 2018年5月16日 上午11:49:11 * @version: V1.0 * @review: 张彬/2018年5月16日 上午11:49:11 */ public class Client { public static void main(String[] args) { DataWire hw = new HuaWei(new Mac()); hw.sendData(); DataWire xm = new XiaoMi(new Windows()); xm.sendData(); } }
输出结果:
hw手机发送数据 mac接受数据 xm手机发送数据 windows接受数据
总结
优点:
1、抽象和实现的分离。
2、优秀的扩展能力。
3、实现细节对客户透明。
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。