桥模式是一种结构型设计模式,它将抽象部分与其实现部分分离,使它们可以独立变化。这种模式通过提供桥梁结构将抽象和实现解耦。
桥模式的结构
桥模式包含以下主要角色:
-
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开发、驱动程序开发等领域有广泛应用,例如不同操作系统下的窗口实现