Bridge,将抽象部分与实现部分分离,使它们都可以独立地变化。
当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象接口,而具体的子类则用不同的方式加以实现。但是,继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。
适用性:
- 你不希望在抽象和它的实现部分之间有一个固定的绑定关系,在程序运行时刻实现部分可以被选择或者切换。
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这样Bridge模式使你可以对不同的抽象接口和实现部分进行组合、扩充。
- 对一个抽象的实现部分的修改应对客户不产生影响。
- 你想对客户完全隐藏抽象的实现部分。
- 你想将一个抽象对象的实现分解成两个部分
- 你想在多个对象间共享实现,但同时要求客户并不知道这一点。
结构:
效果:
1. 分离接口及实现部分。一个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现。接口与实现分离有助于分层,从而产生更好的结构化系统。
2. 提高可扩充性。 可以独立地对Abstraction和Implementor层次结构进行扩充。
示例:
- #include<iostream>
-
- classImplementor
- {
- public:
-
virtual void OperationImp()=0; - };
-
- class ConcreteImplementorA: public Implementor
- {
- public:
-
void OperationImp(){ -
std::cout<<"ConcreteImplementorA::OperationImp()"<< std::endl; -
} - };
-
- class ConcreteImplementorB: public Implementor
- {
- public:
-
void OperationImp(){ -
std::cout<<"ConcreteImplementorB::OperationImp()"<< std::endl; -
} - };
-
- classAbstraction
- {
- public:
-
virtual voidOperation(){_imp->OperationImp();} - protected:
-
Abstraction(Implementor*imp):_imp(imp){} - private:
-
Implementor* _imp; - };
-
- class RefinedAbstraction :public Abstraction
- {
- public:
-
virtual void someExtendOperation() =0; - protected:
-
RefinedAbstraction(Implementor*imp): -
Abstraction(imp){} - };
-
- class Implemention :public RefinedAbstraction
- {
- public:
-
Implemention(Implementor*imp):RefinedAbstraction(imp){} -
voidsomeExtendOperation(){ -
std::cout<<"Implemention::someExtendOperation()"<< std::endl; -
} - };
-
- intmain()
- {
-
std::cout <<"Bridge test" <<std::endl; -
-
Implementor* imp = newConcreteImplementorB; -
RefinedAbstraction* ra = newImplemention(imp); -
ra->Operation(); -
ra->someExtendOperation(); -
-
return 0; - }