软件设计模式——桥接模式(Bridge)
来源:互联网 发布:ubuntu打开怎么用 编辑:程序博客网 时间:2024/06/09 19:39
转载自:http://blog.csdn.net/wangyanguiyiyang
定义与结构
GOF 在《设计模式》中给桥接模式的定义为:将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里的抽象部分和实现部分不是我们通常认为的父类与子类、接口与实现类的关系,而是组合关系。也就是说,实现部分是被抽象部分调用,以用来完成(实现)抽象部分的功能。
而桥接的用意就是:将抽象化和实现化解耦,使得二者独立变化。像我们常用的 JDBC桥 DriverManager一样, JDBC进行连接数据库的时候,在各个之间切换基本不需要动太多代码甚 至丝毫不用动,原因就是 JDBC提供统一接口,每个数 据库各自的实现用叫做据库驱动的程序来桥接就行了。
桥接模式角色组成:
1) 抽象角色(Abstraction) : 它定义了抽象类的接口而且维护着一个指向实现(Implementor)角色的引用。
2) 精确抽象角色(RefinedAbstraction):实现并扩充由抽象角色定义的接口。
3) 实现角色(Implementor):给出了实现类的接口,这里的接口与抽象角色中的接口可以不一致。
4) 具体实现角色(ConcreteImplementor):给出了实现角色定义接口的具体实现。
它再放上个类图就更清晰了:
桥接模式的实现
//实现角色--mplementor/** 首先定义电视机的接口:ITV*/public interface ITV { public void on(); public void off(); public void switchChannel(int channel);}
//具体实现角色--ConcreteImplementor1/** 再实现三星的ITV接口。*/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: channer -"+channel); }}
//具体实现角色--ConcreteImplementor2/** 再实现索尼的ITV接口。*/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); }}
//抽象角色--Abstractionpublic abstract class AbstractRemoteControl { private ITV itv; public AbstractRemoteControl(ITV itv) { this.itv = itv; } public void turnOn() { itv.on(); } public void turnOff() { itv.off(); } public void setChannel(int channel) { itv.switchChannel(channel); }}
//精确抽象角色--RefinedAbstractionpublic class LogitechRemoteControl extends AbstractRemoteControl{ public LogitechRemoteControl(ITV itv) { super(itv); } public void setChannelKeyboard(int channel) { setChannel(channel); System.out.println("Logitech use keyword to set channel"); }}
//测试类public class BridgeTest { public static void main(String[] args) { ITV itv = new SonyTV(); LogitechRemoteControl lrc=new LogitechRemoteControl(itv); lrc.setChannelKeyboard(100); }}
输出结果:
Sony:channel -100
Logitech use keyword to set channel
桥接模式的分析
由上面我们分析得来的桥梁模式,可以看出来桥梁模式应该适用于以下环境:
1) 当你的系统中有多个地方要使用到类似的行为,或者是多个类似行为的组合时,可以考虑使用桥梁模式来提高重用,并减少因为行为的差异而产生的子类。
2) 系统中某个类的行为可能会有几种不同的变化趋势,为了有效的将变化封装,可以考虑将类的行为抽取出来。
3) 当然上面的情况也可以是这样,行为可能要被不同相似类使用,也可以考虑使用桥梁模式来实现。
桥梁模式使用了低耦合性的组合代替继承,使得它具备了不少好处:
1) 将可能变化的部分单独封装起来,使得变化产生的影响最小,不用编译不必要的代码。
2) 抽象部分和实现部分可以单独的变动,并且每一部分的扩充都不会破坏桥梁模式搭起来架子。
3) 对于客户程序来说,你的实现细节是透明的。
- 软件设计模式——桥接模式(Bridge)
- 桥接模式—Bridge
- Java设计模式——桥接模式(Bridge)
- 桥接模式——Bridge
- Bridge——桥接模式
- 桥接模式——bridge
- 桥接模式(Bridge)
- 桥接模式(Bridge)
- Bridge(桥接模式)
- 桥接模式(Bridge)
- 桥接模式(Bridge)
- 桥接模式(Bridge)
- 桥接模式(Bridge)
- 桥接模式(Bridge)
- Bridge(桥接模式)
- 桥接模式(Bridge)
- 桥接模式(Bridge)
- 桥接模式(Bridge)
- ServletConfig 总结
- 剑指offer替换空格问题
- mybatis 和 Hibernate对比
- 设计模式学习第五天
- Java微信公众号开发
- 软件设计模式——桥接模式(Bridge)
- MediaRecorder类介绍
- 随机森林原理篇
- 新CENTOS搭建之后的工作
- MacOS搭建JavaWeb环境记录
- 《PVCS 7.5 工业级的软件配置管理工具》(PVCS 7.5)7.5
- 关于Servlet、servletContext、servletrequest、servletResponse生命周期
- 2016 年最值得程序员阅读的开源书:《全栈增长工程师指南》
- leetcode_324_Power of Four(C++)(easy)