桥接模式(bridge)
定义
将抽象部分与实现部分分离,使它们都可以独立的变化。
UML类图
角色
Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。
上图中ConcreteImplementor是决堤的实现,而refineAbstraction是抽象,让两者分离,就是桥接模式的主要功能。
例子
可以通过遥控器让电视完成各种各样的功能。
Implementor
package com.csdhsm.pattemdesign.bridge; /** * @Title: ITV.java * @Description: 电视功能接口 * @author: Han * @date: 2016年6月27日 下午1:48:07 */ public interface ITV { //开电视 public void on(); //关电视 public void off(); //选择频道 public void switchChannel(int channel); }
具体实现类
package com.csdhsm.pattemdesign.bridge; /** * @Title: SamsungTV.java * @Description: 三星电视 * @author: Han * @date: 2016年6月27日 上午11:25:28 */ public class SamsungTV implements ITV { @Override public void on() { System.out.println("Samsung is turned on."); } @Override public void off() { System.out.println("Samsung is turned off."); } @Override public void switchChannel(int channel) { System.out.println("Samsung: channel - " + channel); } }
package com.csdhsm.pattemdesign.bridge; /** * @Title: SonyTV.java * @Description: 索尼电视 * @author: Han * @date: 2016年6月27日 上午11:27:49 */ public class SonyTV implements ITV { @Override public void on() { System.out.println("Sony is turned on."); } @Override public void off() { System.out.println("Sony is turned off."); } @Override public void switchChannel(int channel) { System.out.println("Sony: channel - " + channel); } }
遥控器抽象类
package com.csdhsm.pattemdesign.bridge; /** * @Title: AbstractRemoteControl.java * @Description: 遥控器抽象类,包含对TV的引用 * @author: Han * @date: 2016年6月27日 下午1:25:21 */ public abstract class AbstractRemoteControl { private ITV tv; public AbstractRemoteControl(ITV tv) { this.tv = tv; } public void turnOn() { tv.on(); } public void turnOff() { tv.off(); } public void setChannel(int channel) { tv.switchChannel(channel); } }
遥控器的具体实现类
package com.csdhsm.pattemdesign.bridge; /** * @Title: LogitechRemoteControl.java * @Description: 遥控器的具体实现类 * @author: Han * @date: 2016年6月27日 下午1:51:53 */ public class LogitechRemoteControl extends AbstractRemoteControl { public LogitechRemoteControl(ITV tv) { super(tv); } public void setChannelKeyBoard(int channel) { super.setChannel(channel); System.out.println("Logitech use keyword to set channel."); } }
客户端
package com.csdhsm.pattemdesign.bridge; public class Solution { public static void main(String[] args) { ITV tv = new SonyTV(); LogitechRemoteControl lrc = new LogitechRemoteControl(tv); lrc.setChannelKeyBoard(100); } }
总结
桥接模式关键是把抽象与行为实现相分离,动态结合。