bridge(桥接)——对象结构型模式
1.意图
将抽象部分与它的实现部分分离,使他们都可以独立的变化
2.别名
handle/body
3.动机
当一个抽象可以有多个实现时,通常用继承来协调他们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。
但是此方法有时候不够灵活,继承机制将抽象部分和实现部分固定在一起,难以独立进行修改扩充和重用。
bridge将抽象和实现分开,在中间起到了桥梁的作用,使他们可以独立变化。
4.适用性
1)你不希望在抽象和实现部分之间有一个固定的绑定关系,在程序运行时刻实现部分应该可以被选择或者切换。
2)类的抽象以及他的实现部分都应该可以通过生成子类的方法加以扩充。
3)对一个抽象的实现部分的修改应该对客户不产生影响,即客户的代码不需要重新编译。
4)(C++)你想对客户完全隐藏抽象的实现部分,在C++中,类的表示在类接口中是可以看见的。
5)有很多累要生成,这种类层次结构说明需要将对象分解
6)你想在多个对象间共享实现,但是要求客户并不知道这一点
5.结构
参考:http://www.cnblogs.com/jillzhang/archive/2006/08/28/488562.html
6.参与者
abstraction
定义抽象类的接口
维护一个纸箱implementor类型对象的指针
refinedAbstraction
扩充由abstraction定义的接口
implementor
定义实现类的接口,该接口不一定要与abstraction完全一致,事实上这两个接口可以完全不同。一般来讲,implementor接口仅仅提供基本操作,而abstraction定义了基于这些基本操作的较高层次的操作。
ConcreteImplementor
实现Implementor的接口并定义它的具体实现
7.协作
abstraction将client的请求转发给它的Implementor对象
8.效果
1)分离接口及其实现部分
有助于降低对实现部分编译时刻的依赖性。有助于分层,产生更好的结构化系统。
2)提高可扩充性
可以独立地对两个层次结构进行扩充
3)实现细节对客户透明
9.实现
1)仅有一个Implementor
在仅有一个实现的时候,没有必要创建一个抽象的implementor类,这是一个bridge模式的退化情况。在abstraction和implementor之间有一种一对一的关系。
2)创建正确的implementor对象
3)共享implementor对象
4)采用多重继承机制
10.代码实现
#include<iostream>
using namespace std;
class AbstractCar
{
public:
virtual void run(){};
};
class bus:public AbstractCar
{
public:
void run()
{
cout<<"a bus running"<<endl;
}
};
class car:public AbstractCar
{
public:
void run()
{
cout<<"a car running"<<endl;
}
};
class AbstractLoad
{
public:
virtual void carRun(){}
AbstractCar *abc;
};
class countryLoad:public AbstractLoad
{
public:
void carRun()
{
cout<<"on the country load"<<endl;
abc->run();
}
};
class highWay:public AbstractLoad
{
public:
void carRun()
{
cout<<"on the highway"<<endl;
abc->run();
}
};
int main()
{
AbstractLoad *cload = new countryLoad();
AbstractLoad *hload = new highWay();
AbstractCar *c = new car();
AbstractCar *b = new bus();
cload->abc = c;
cload->carRun();
cout<<endl;
cload->abc = b;
cload->carRun();
cout<<endl;
hload->abc = c;
hload->carRun();
cout<<endl;
hload->abc = b;
hload->carRun();
}
11.相关模式
abstractFactory模式可以用来创建和配置一个特定的bridge模式
adapter模式用来帮助无关的类协同工作,通常在系统设计完之后才会被使用。而bridge模式则是在系统开始时就被使用,他使抽象接口和实现部分可以独立进行改变
原文链接: https://www.cnblogs.com/w0w0/archive/2012/05/19/2509037.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/50615
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!