桥接模式通过组合将抽象与实现分离,使二者独立变化。定义Implementor接口,ConcreteImplementorA实现具体操作,抽象类持Implementor指针。

桥接模式的核心是把“抽象”和“实现”解耦,让两者可以独立变化。在C++中,通过组合而非继承来实现这种分离,通常使用指针或引用将实现部分注入到抽象类中。
定义实现接口(Implementor)
先定义一个实现层的基类,提供接口供具体实现类继承。
class Implementor {
public:
virtual ~Implementor() = default;
virtual void operationImpl() = 0;
};
class ConcreteImplementorA : public Implementor {
public:
void operationImpl() override {
std::cout << "ConcreteImplementorA operation\n";
}
};
class ConcreteImplementorB : public Implementor {
public:
void operationImpl() override {
std::cout << "ConcreteImplementorB operation\n";
}
};
定义抽象接口(Abstraction)
抽象类持有一个指向实现对象的指针,通过委托调用实际操作。
class Abstraction {
protected:
std::unique_ptr impl;
public:
Abstraction(std::unique_ptr implementation)
: impl(std::move(implementation)) {}
virtual ~Abstraction() = default;
virtual void operation() {
impl->operationImpl();
}
};
class RefinedAbstraction : public Abstraction {
public:
RefinedAbstraction(std::unique_ptr implementation)
: Abstraction(std::move(implementation)) {}
void operation() override {
std::cout << "RefinedAbstraction doing extra logic...\n";
impl->operationImpl();
}
};
使用示例
客户端代码可以根据需要组合不同的抽象和实现。
立即学习“C++免费学习笔记(深入)”;
int main() {
// 使用不同实现配合不同抽象
auto implA = std::make_unique();
auto implB = std::make_unique();
Abstraction abstractionA(std::move(implA));
RefinedAbstraction refinedB(std::make_unique());
abstractionA.operation(); // 输出 A 的实现
refinedB.operation(); // 输出 B 的实现并带额外逻辑
return 0;
}
这种方式避免了类爆炸问题。比如有3种抽象变体和4种实现方式,传统继承需要12个子类,而桥接模式只需3 + 4 = 7个类。关键是把实现作为成员变量注入抽象类,运行时可替换,扩展性强。
基本上就这些,结构清晰,易于维护。










