作用:
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
UML结构图:
抽象基类:
1)Abstraction:某个抽象类,它的实现方式由Implementor完成。
2)Implementor:实现类的抽象基类,定义了实现Abastraction的基本操作,而它的派生类实现这些接口。
接口函数:
1)Implementor::OperationImpl:定义了为实现Abstraction需要的基本操作,由Implementor的派生类实现之,而在Abstraction::Operation函数中根据不同的指针多态调用这个函数。
解析:
Bridge用于将表示和实现解耦,两者可以独立的变化。在Abstraction类中维护一个Implementor类指针,需要采用不同的实现方式的时候只需要传入不同的Implementor派生类就可以了。
Bridge的实现方式其实和Builder十分的相近,可以这么说:本质上是一样的,只是封装的东西不一样罢了。两者的实现都有如下的共同点:抽象出来一 个基类,这个基类里面定义了共有的一些行为,形成接口函数(对接口编程而不是对实现编程),这个接口函数在Buildier中是BuildePart函数 在Bridge中是OperationImpl函数;
其次,聚合一个基类的指针,如Builder模式中Director类聚合了一个Builder基类 的指针,而Brige模式中Abstraction类聚合了一个Implementor基类的指针(优先采用聚合而不是继承);而在使用的时候,都把对这 个类的使用封装在一个函数中,在Bridge中是封装在Director::Construct函数中,因为装配不同部分的过程是一致的,而在 Bridge模式中则是封装在Abstraction::Operation函数中,在这个函数中调用对应的 Implementor::OperationImpl函数。就两个模式而言,Builder封装了不同的生成组成部分的方式,而Bridge封装了不同 的实现方式。
=======================
http://blog.csdn.net/mafuli007/article/details/8193936
/* 桥接模式:将抽象部分与它的实现部分相分离,他们可以独立变化。 合成/聚合复用原则CARP原则:面向对象设计的一个重要原则: 尽量使用合成/聚合,尽量不用使用类的继承 优点: (1)分离抽象接口及其实现部分。 (2)桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则 (即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的 个数非常庞大,桥接模式是比多继承方案更好的解决方法。 (3)桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都 不需要修改原有系统。 (4)实现细节对客户透明,可以对用户隐藏实现细节。 应用举例: 一个画板的形状可以是圆形的,正方形的,颜色可以是红色,绿色, 那要求一个实现一个画板就可以采用桥接模式 Created by Phoenix_FuliMa */ #include <iostream> using namespace std; class Implementor { public: virtual void Show() {} }; class Implementor1:public Implementor { public: virtual void Show() { cout<<"Implementor1 is showing..."<<endl; } }; class Implementor2: public Implementor { public: virtual void Show() { cout<<"Implementor2 is showing.."<<endl; } }; class Abstractor { Implementor *_implementor; public: virtual void SetImplementor(Implementor* ot) { this->_implementor = ot; } virtual void operate() { _implementor->Show(); } }; class RefinedAbstractor:public Abstractor { }; int main() { Implementor1 * im1 = new Implementor1(); Implementor2 * im2 = new Implementor2(); RefinedAbstractor *re = new RefinedAbstractor(); re->SetImplementor(im1); re->operate(); re->SetImplementor(im2); re->operate(); delete im1; delete im2; delete re; system("pause"); return 0; }