桥接模式
桥接模式
桥接模式是一种结构型设计模式,它的核心思想是将抽象部分与实现部分分离,使它们可以独立变化。桥接模式将抽象与实现解耦,使两者可以独立地变化。它通过组合而非继承来实现这种解耦。
核心组成部分如下:
- 抽象(Abstraction):定义抽象类的接口
- 精确抽象(Refined Abstraction):扩展抽象类的接口
- 实现(Implementor):定义实现类的接口
- 具体实现(Concrete Implementor):实现实现类接口的具体类
适用场景
- 需要避免抽象和实现的永久绑定:例如,一个图形系统需要支持多种渲染引擎。
- 抽象和实现都需要通过子类扩展:例如,不同形状(圆形、方形)和不同颜色(红色、蓝色)的组合。
- 实现的变化不应该影响客户端:客户端代码只依赖于抽象接口。
- 需要在运行时切换实现:例如,在不同平台上使用不同的API实现。
- 有多个维度的变化:当系统有多个正交的变化维度时,使用桥接模式比使用继承更合适。
示例
#include <iostream>
#include <string>
#include <memory>
// 实现部分的接口
class Implementor {
public:
virtual ~Implementor() = default;
virtual void operationImpl() const = 0;
};
// 具体实现A
class ConcreteImplementorA : public Implementor {
public:
void operationImpl() const override {
std::cout << "ConcreteImplementorA operation" << std::endl;
}
};
// 具体实现B
class ConcreteImplementorB : public Implementor {
public:
void operationImpl() const override {
std::cout << "ConcreteImplementorB operation" << std::endl;
}
};
// 抽象部分
class Abstraction {
protected:
std::shared_ptr<Implementor> implementor;
public:
Abstraction(std::shared_ptr<Implementor> impl) : implementor(impl) {}
virtual ~Abstraction() = default;
virtual void operation() const {
std::cout << "Abstraction: ";
implementor->operationImpl();
}
};
// 精确抽象
class RefinedAbstraction : public Abstraction {
public:
RefinedAbstraction(std::shared_ptr<Implementor> impl) : Abstraction(impl) {}
void operation() const override {
std::cout << "RefinedAbstraction: ";
implementor->operationImpl();
}
// 扩展的方法
void additionalOperation() const {
std::cout << "Additional operation in RefinedAbstraction" << std::endl;
implementor->operationImpl();
}
};
int main() {
// 创建实现
auto implA = std::make_shared<ConcreteImplementorA>();
auto implB = std::make_shared<ConcreteImplementorB>();
// 创建抽象
Abstraction abstraction(implA);
abstraction.operation();
// 创建精确抽象,使用不同的实现
RefinedAbstraction refinedAbstraction(implB);
refinedAbstraction.operation();
refinedAbstraction.additionalOperation();
// 动态切换实现
refinedAbstraction = RefinedAbstraction(implA);
refinedAbstraction.operation();
return 0;
}

观察抽象部分,其使用组合的方法获得接口的声明,通过传入具体实现从而实现动态多态调用。抽象接口的使用允许组件之间在不了解具体实现的情况下彼此交互。