最近自学了设计模式,发现好多书的java实现的。因为本人是从事C++开发的,因此想尝试用C++自己实现一遍,加深理解。
桥接模式
定义:
将抽象部分与它的实现部分分离,使它们都可以独立变化
适用性:
1、 不希望在抽象和它的实现部分之间有一个固定的绑定关系。
2、 类的抽象以及它的实现都应该可以通过生产子类的方法加以扩充。
3、 对抽象的实现部分的修改应对客户不产生影响
4、 想对客户隐藏抽象的实现部分
5、 想在多个对象间共享实现,同时客户并不知道
结构类图:

Abstraction:
定义抽象类接口并且维护一个指向Implementor的指针
RefinedAbstraction:< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+wKmz5EFic3RyYWN0aW9utqjS5bXEvdO/2jwvcD4KPHA+SW1wbGVtZW50b3KjujwvcD4KPHA+tqjS5cq1z9bA4LXEvdO/2jwvcD4KPHA+Q29uY3JldGVJbXBsZW1lbnRvckEgICBDb25jcmV0ZUltcGxlbWVudG9yQjwvcD4KPHA+yrXP1kltcGxlbWVudG9ytcS907/aPC9wPgo8cCBhbGlnbj0="left">优点:
1、 分离接口以及其实现部分
2、 提供可扩充性
3、 实现细节对客户透明
实现:
class Implementor
{
public:
Implementor(){}
virtual void doSomething() = 0;
};
//具体实现类A
classConcreteImplementorA:public Implementor
{
public:
ConcreteImplementorA(){}
voiddoSomething()
{
cout<<"ConcreteImplementorA doSomething"<
}
};
//具体实现类B
classConcreteImplementorB:public Implementor
{
public:
ConcreteImplementorB(){}
voiddoSomething()
{
cout<<"ConcreteImplementorB doSomething"<
}
};
//抽象接口部分
class Abstraction
{
public:
Abstraction(Implementor*pimp):m_pImp(pimp)
{}
//仅仅调用实现部分
virtual void Request()
{
m_pImp->doSomething();
}
private:
Implementor *m_pImp;
};
class RefinedAbstraction:public Abstraction
{
public:
RefinedAbstraction(Implementor*pimp):Abstraction(pimp)
{}
//扩充Request接口功能
void Request()
{
cout<<"RefinedAbstraction Request"<
Abstraction::Request();
}
};
//可以实现接口部分和实现部分的组合
Implementor*pimpa = new ConcreteImplementorA;
Implementor *pimpb = new ConcreteImplementorB;
Abstraction *pa = new RefinedAbstraction(pimpa);
Abstraction *pb = new RefinedAbstraction(pimpb);
pa->Request();
pb->Request();