本文适合新手和小白
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、代码编写
#include<iostream>
using 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<<"张三用来包饺子"<<endl;
}
~ConcreteImplementorA(){}
};
class ConcreteImplementorB:public Implementor{
public:
void OperationImp(){
cout<<"李四用来做包子"<<endl;
}
~ConcreteImplementorB(){};
};
void RefinedAbstraction::Operation(){
cout<<"老板把面回来了,";
imp->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
老板把面回来了,张三用来包饺子
老板把面回来了,李四用来做包子