【软件设计师中级】设计模式之桥接模式学习笔记(c++)

本文适合新手和小白

1、birdge(桥接)

(1)意图

将抽象类与实现部门分离,使他们都可以独立变化

(2)结构

【软件设计师中级】设计模式之桥接模式学习笔记(c++)_第1张图片

Abstraction定一个抽象类接口,维护一个指向Implementor指针。

RefineAbstraction扩充Abstraction定义的接口。

Implementor定一个实现类的接口,该接口不一定要与Abstraction接口完全一致,事实上这两个接口可以完全不同,一般来说,Implementor指接口仅仅提供基本操作而Abstraction定义基于这些操作的较高层次的操作

ConcreteImplementor实现Implementor接口并定义她具体实现

(3) 适用性

1、不希望抽象和她的实现部分之间有一个固定的绑定关系。

2、类的抽象以及她的实现都可以通过生成子类的方法加以扩充。

3、多一个抽象的实现部分的修改应对客户不产生影响

4、c++想对客户完全隐藏抽象实现部分

5、有许多类要生成类层次结构

2、根据UMl类图编写代码

【软件设计师中级】设计模式之桥接模式学习笔记(c++)_第2张图片

     通过对UML图的理解,Abstraction和Implementor是两个独立的类,各做个的工作。在Abstraction中通过关联(特殊关联聚合)的方式,设置一个指向Implementor的指针,对Implementor类所有的方法和进行掌握和了解,在RefineAbstraction类中根据Implementor的指针,对Abstraction中的方法进行扩充。

     举例:Abstraction类是一个开面点的老板,RefineAbstraction是这个老板的一个面店,老板只负责把面粉买回来,具体的工作通过老板权力(imp)交由职工(Implementor)来完成,具体的工作由不同的面点师( ConcreteImplementor )来做,老板通过Operation()方法让面点师开始干活,面点师则根据自己的分工做出不同的面食比如包子和饺子。

3、代码编写

#include
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<<"张三用来包饺子"<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
老板把面回来了,张三用来包饺子
老板把面回来了,李四用来做包子
 

你可能感兴趣的:(设计模式,设计模式,桥接模式,学习)