设计模式 c++版(21)——桥梁模式

定义:将抽象和实现解耦,使得两者可以独立地变化。


示例一:桥梁模式(通用版)

1. 类图 29-4
设计模式 c++版(21)——桥梁模式_第1张图片

 

2. 类图说明

  • Abstraction 抽象化角色。主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
  • Implementor 实现化角色。它是接口或抽象类,定义角色必须的行为和属性。
  • RefinedAbstraction 修正抽象化角色。它引用实例化角色对抽象化角色进行修正。
  • ConcreteImplementor 具体实现化角色。它实现接口或抽象类定义的方法和属性。

 

3. 代码清单
 

#include 
#include 

//实现化角色
class Implementor
{
public:
    virtual void    doSomething() = 0;
    virtual void    doAnything()  = 0;
};

//具体实现化角色
class Implementor1:public Implementor
{
public:
    virtual void    doSomething()
    {
        qDebug() << "Implementor1 doSomething";
    }

    virtual void    doAnything()
    {
        qDebug() << "Implementor1 doSomething";
    }
};

class Implementor2:public Implementor
{
public:
    virtual void    doSomething()
    {
        qDebug() << "Implementor2 doSomething";
    }

    virtual void    doAnything()
    {
        qDebug() << "Implementor2 doSomething";
    }
};

//抽象化角色
class Abstraction
{
public:
    Abstraction(Implementor *implementor)   //约束子类必须实现该构造
    {
        this->m_implementor = implementor;
    }
    virtual void    request()
    {
        this->m_implementor->doSomething();
    }
    Implementor*    getImp()
    {
        return this->m_implementor;
    }

private:
    Implementor *m_implementor;
};

//具体抽象化角色
class RefinedAbstraction:public Abstraction
{
public:
    RefinedAbstraction(Implementor *implementor):Abstraction(implementor){}
    virtual void    request()
    {
        qDebug() << "RefinedAbstraction request";
        Abstraction::request();
        this->getImp()->doAnything();
    }
};

int main()
{
    Implementor *implementor = new Implementor1();
    Abstraction abs(implementor);
    abs.request();
    
    return 0;
}

 

 

二、桥梁模式的应用

1. 优点:

  •  抽象和实现分离。为了解决继承的缺点而提出的设计模式。该模式下,实现可以不受抽象的约束,不用绑定在一个固定的抽象层次上。
  •  优秀的扩充能力。只要对外暴露的接口层允许这样的变化,可以把变化的可能性减到最小。
  •  实现细节对客户透明。客户不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装。

 

2. 使用场景:

 不希望或不适用使用继承的场景。例:继承层次过渡、无法更细化设计颗粒等场景,需要考虑使用桥梁模式。
 接口或抽象类不稳定的场景。
 重用性要求较高的场景。


3. 注意事项:

 桥梁模式是非常简单的,使用该模式时主要考虑如何拆分抽象和实现,并不是一涉及继承就要考虑使用该模式。桥梁模式的意图还是对变化的封装,尽量把可能变化的因素封装到最细、最小的逻辑单元中,避免风险扩散。在进行系统设计时,发现类的继承有N层时,可以考虑使用桥梁模式。

 

 


参考文献《秦小波. 设计模式之禅》(第2版) (华章原创精品) 机械工业出版社

你可能感兴趣的:(设计模式)