定义:将抽象和实现解耦,使得两者可以独立地变化。
示例一:桥梁模式(通用版)
1. 类图 29-4

2. 类图说明
- Abstraction 抽象化角色。主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
- Implementor 实现化角色。它是接口或抽象类,定义角色必须的行为和属性。
- RefinedAbstraction 修正抽象化角色。它引用实例化角色对抽象化角色进行修正。
- ConcreteImplementor 具体实现化角色。它实现接口或抽象类定义的方法和属性。
3. 代码清单
#include <QCoreApplication>
#include <QDebug>
//实现化角色
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版) (华章原创精品) 机械工业出版社