设计模式五:桥模式(Bridge Pattern)

桥模式是一种结构型设计模式,它将抽象部分与其实现部分分离,使它们可以独立变化。这种模式通过提供桥梁结构将抽象和实现解耦。

桥模式的结构

桥模式包含以下主要角色:

  1. Abstraction(抽象类):定义抽象接口,维护一个指向Implementor的指针

  2. RefinedAbstraction(扩充抽象类):扩展Abstraction定义的接口

  3. Implementor(实现类接口):定义实现类的接口

  4. 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结构图

桥模式的应用场景

  1. 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时

  2. 当需要避免在抽象和实现之间形成永久绑定时

  3. 当需要在运行时切换不同的实现时

桥模式在GUI开发、驱动程序开发等领域有广泛应用,例如不同操作系统下的窗口实现

相关推荐
Ulyanov10 小时前
深入QML滑块与进度控制:构建动态数据可视化界面:QML+PySide6现代开发入门(六)
开发语言·python·算法·ui·信息可视化·雷达电子对抗仿真
星马梦缘10 小时前
ACM笔记 学习版本
数据结构·c++·算法
CQU_JIAKE10 小时前
6.1【A】
算法
wayz1110 小时前
Momentum:CTI(相关趋势指标)技术指标详解
算法·金融·数据分析·量化交易·特征工程
fengxin_rou10 小时前
【滑动窗口与前缀和算法实战】:LeetCode560.438 高频题深度解析
java·算法·leetcode
Dillon Dong10 小时前
【风电控制】FPGA vs DSP 在ADC采样中的选择——从架构差异到工程实践
算法·变流器·风电控制·dfig
科研小白_10 小时前
【第九期:MATLAB点云处理基础】基于 Alpha Shapes 的边缘点提取
算法
sali-tec10 小时前
C# 基于OpenCv的视觉工作流-章80-长短脚
图像处理·人工智能·opencv·算法·计算机视觉
sul.i11 小时前
浅析·指针
算法
春日见11 小时前
策略梯度算法
算法