设计模式五:桥模式(Bridge Pattern)
桥模式是一种结构型设计模式,它将抽象部分与其实现部分分离,使它们可以独立变化。这种模式通过提供桥梁结构将抽象和实现解耦。
桥模式的结构
桥模式包含以下主要角色:
Abstraction(抽象类):定义抽象接口,维护一个指向Implementor的指针
RefinedAbstraction(扩充抽象类):扩展Abstraction定义的接口
Implementor(实现类接口):定义实现类的接口
ConcreteImplementor(具体实现类):实现Implementor接口
桥模式的优点
分离抽象接口及其实现部分
提高可扩展性,可以独立扩展抽象和实现部分
实现细节对客户端透明
C++ 桥模式实现示例
#include <iostream>
#include <string>// 实现类接口
class Implementor {
public:virtual ~Implementor() {}virtual std::string operationImpl() const = 0;
};// 具体实现类A
class ConcreteImplementorA : public Implementor {
public:std::string operationImpl() const override {return "ConcreteImplementorA: Here's the result on platform A.\n";}
};// 具体实现类B
class ConcreteImplementorB : public Implementor {
public:std::string operationImpl() const override {return "ConcreteImplementorB: Here's the result on platform B.\n";}
};// 抽象类
class Abstraction {
protected:Implementor* implementor_;public:Abstraction(Implementor* implementor) : implementor_(implementor) {}virtual ~Abstraction() {}virtual std::string operation() const {return "Abstraction: Base operation with:\n" + implementor_->operationImpl();}
};// 扩充抽象类
class ExtendedAbstraction : public Abstraction {
public:ExtendedAbstraction(Implementor* implementor) : Abstraction(implementor) {}std::string operation() const override {return "ExtendedAbstraction: Extended operation with:\n" + implementor_->operationImpl();}
};// 客户端代码
void ClientCode(const Abstraction& abstraction) {std::cout << abstraction.operation();
}int main() {Implementor* implementorA = new ConcreteImplementorA;Abstraction* abstraction = new Abstraction(implementorA);ClientCode(*abstraction);std::cout << "\n";Implementor* implementorB = new ConcreteImplementorB;Abstraction* extendedAbstraction = new ExtendedAbstraction(implementorB);ClientCode(*extendedAbstraction);delete implementorA;delete implementorB;delete abstraction;delete extendedAbstraction;return 0;
}
输出示例
Abstraction: Base operation with:
ConcreteImplementorA: Here's the result on platform A.ExtendedAbstraction: Extended operation with:
ConcreteImplementorB: Here's the result on platform B.
UML结构图
桥模式的应用场景
当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时
当需要避免在抽象和实现之间形成永久绑定时
当需要在运行时切换不同的实现时
桥模式在GUI开发、驱动程序开发等领域有广泛应用,例如不同操作系统下的窗口实现