定义
【GOF95】在提出桥梁模式的时候指出,桥梁模式的用意是"将抽象化(Abstraction)与实现化脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。
抽象化:存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待【LISKOV94】。
实现化:抽象化给出的具体实现,就是实现化。
脱耦:所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。
将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。
UML
抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
修正抽象化(Refined Abstraction)角色:扩展抽象化角色,改变和修正父类对抽象化的定义。
实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。
实例
public interface Implementor { public void operationImpl(); } public class ConcreteImplementor implements Implementor { public void operationImpl() { //具体实现 } } public abstract class Abstraction { protected Implementor impl; public void setImpl(Implementor impl) { this.impl=impl; } public abstract void operation(); } public class RefinedAbstraction extends Abstraction { public void operation() { //代码 impl.operationImpl(); //代码 } }
来一个难一点的例子
public interface Color { void bepaint(String penType,String name); } public abstract class Pen { protected Color color; public void setColor(Color color) { this.color=color; } public abstract void draw(String name); } public class SmallPen extends Pen { public void draw(String name) { String penType="小号毛笔绘制"; this.color.bepaint(penType,name); } } public class MiddlePen extends Pen { public void draw(String name) { String penType="中号毛笔绘制"; this.color.bepaint(penType,name); } } public class Green implements Color { public void bepaint(String penType,String name) { System.out.println(penType + "绿色的"+ name + "."); } } public class Red implements Color { public void bepaint(String penType,String name) { System.out.println(penType + "红色的"+ name + "."); } } public class Client { public static void main(String a[]) { Color color = new Green(); Pen pen = new MiddlePen (); pen.setColor(color); pen.draw("鲜花"); } }
优点
1.分离抽象接口及其实现部分,将实现予以解耦。
2.桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
3.桥接模式提高了系统的可扩充性, 抽象和实现可以独立扩展,不会影响到对方或者说在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
4.对于具体实现的修改,不会影响到客户端。
缺点
1.桥接模式的引入会增加系统的理解与设计难度, 增加了设计复杂度。由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
2.桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
使用场景
1.当需要用不同的方式改变接口和实现时,如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2.抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
3.一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
4.对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
以上整理资源来自百度百科以及http://blog.csdn.net/sells2012/article/details/8242712
相关推荐
JAVA-设计模式-结构型模式-桥接模式
c++设计模式-结构型模式-桥接模式;qt工程,c++简单源码; 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度...
设计模式_结构型_桥接模式
Bridge 桥接模式(结构型模式)视频
创建型模式 (100%) 设计模式面面观(8):创建型模式总结 (100%) 设计模式面面观(9):适配器模式(Adapter Pattern)-结构型模式 (100%) 设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式 ...
C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式) 体验课程
7、桥接模式(bridge) 用意:将抽象部分和实现部分分离,使他们可以独自变化
C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式) (Level 300)
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要资源... 这是第8节:结构型模式Bridge桥接模式
桥接模式是一种结构型设计模式,它的目的是将抽象化与实现化解耦,使得它们可以独立变化。这种模式主要用于处理当一个类存在两个或多个独立的变化的维度时的情况,例如,当一个类的抽象部分和实现部分可能发生变化,...
【例3.14】桥接模式-几何立体体积 【例4.1】迭代器模式-矩阵搜索 【例4.2】迭代器模式-产品搜索 【例4.4】访问者模式-名牌鞋销售软件 【例4.5】访问者模式-计算机部件销售软件 【例4.6】命令模式-...
NULL 博文链接:https://jacky-dai.iteye.com/blog/2297785
介绍桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的
作业1(工厂模式) .doc 作业2(建造者及适配器模式) .docx 作业3(装饰器和代理) .docx 作业4(桥接模式) .docx 作业5(组合模式) .docx 作业6(策略模式) .docx ...part10-结构型设计模式-桥接模式.pptx
设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略...
主要介绍了Java结构型设计模式中的适配器模式与桥接模式,结构型设计模式是从程序的结构上解决模块之间的耦合问题,需要的朋友可以参考下
设计模式之结构型模式有适配器模式 桥接模式 等结构模式 有文档和案例有利于初学者