本文适合新手和小白
1、birdge(桥接) (1)意图将抽象类与实现部门分离,使他们都可以独立变化
(2)结构Abstraction定一个抽象类接口,维护一个指向Implementor指针。
RefineAbstraction扩充Abstraction定义的接口。
Implementor定一个实现类的接口,该接口不一定要与Abstraction接口完全一致,事实上这两个接口可以完全不同,一般来说,Implementor指接口仅仅提供基本操作而Abstraction定义基于这些操作的较高层次的操作
ConcreteImplementor实现Implementor接口并定义她具体实现
(3) 适用性1、不希望抽象和她的实现部分之间有一个固定的绑定关系。
2、类的抽象以及她的实现都可以通过生成子类的方法加以扩充。
3、多一个抽象的实现部分的修改应对客户不产生影响
4、c++想对客户完全隐藏抽象实现部分
5、有许多类要生成类层次结构
2、根据UMl类图编写代码通过对UML图的理解,Abstraction和Implementor是两个独立的类,各做个的工作。在Abstraction中通过关联(特殊关联聚合)的方式,设置一个指向Implementor的指针,对Implementor类所有的方法和进行掌握和了解,在RefineAbstraction类中根据Implementor的指针,对Abstraction中的方法进行扩充。
举例:Abstraction类是一个开面点的老板,RefineAbstraction是这个老板的一个面店,老板只负责把面粉买回来,具体的工作通过老板权力(imp)交由职工(Implementor)来完成,具体的工作由不同的面点师( ConcreteImplementor )来做,老板通过Operation()方法让面点师开始干活,面点师则根据自己的分工做出不同的面食比如包子和饺子。
3、代码编写#includeusing namespace std; class Implementor;//前置声明 class Abstraction{ public: virtual void set_imp(Implementor* imlemetor)=0; virtual void Operation()=0; virtual ~Abstraction(){}; }; class RefinedAbstraction:public Abstraction{ public: void set_imp(Implementor* imp){ this->imp=imp; } void Operation();//前向声明无法知道类中具体有什么,所以相关的操作必须写在Imlemtor定义后做内外操作。 private: Implementor * imp;//关联关系中的聚合,可以有多个方法。 ~RefinedAbstraction(){} }; class Implementor{ public: virtual void OperationImp()=0; virtual ~ Implementor(){} }; class ConcreteImplementorA:public Implementor{ public: void OperationImp(){ cout<<"张三用来包饺子"< OperationImp(); } int main(){ Implementor *b=new ConcreteImplementorA;//雇佣包子师傅张三 Implementor *c=new ConcreteImplementorB;//雇佣饺子师傅李四 Abstraction *a=new RefinedAbstraction;//老板开店买好了面粉并拥有了指挥职工的人事权。 a->set_imp(b);//老板把买回来的面给了张三 a->Operation();//老板下达工作命令,张三包好饺子 a->set_imp(c);//老板把面粉又给了李四 a->Operation();//老板下达工作命令,李四做了包子 return 0; }
输出结果:
./a.out
老板把面回来了,张三用来包饺子
老板把面回来了,李四用来做包子



