C++设计模式——Bridge模式(上)

一、什么是桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分和实现部分解耦,使得它们可以独立地变化。该模式使用了组合关系来替代继承,从而达到降低系统复杂度的目的。C++作为一门面向对象的编程语言,自然也可以使用桥接模式来解决相关问题。在本篇文章中,我们将会详细介绍C++桥接模式的实现原理,以及如何使用该模式来优化代码结构和可维护性。

二、桥接模式的定义与组成结构

桥接模式(Bridge Pattern)定义了如何将抽象和实现分离,以便两者可以独立地变化。桥接模式通常使用组合关系而不是继承关系来完成此任务。桥接模式包含四个部分:抽象部分(Abstraction)、实现部分(Implementor)、扩展抽象部分(Refined Abstraction)和具体实现部分(Concrete Implementor)。

三、桥接模式实现的步骤

在使用桥接模式时,通常需要按照以下步骤进行实现:

1、定义抽象部分的接口,并将其与实现部分的接口解耦。

2、定义实现部分的接口,并实现其具体实现。

3、在抽象部分中包含一个指向实现部分的指针,并在实现部分中包含一个指向抽象部分的指针。

4、定义扩展抽象部分,并在其中调用实现部分的接口。

5、定义具体实现部分,并实现其具体实现。

6、在客户端代码中创建抽象部分的对象,并通过传递具体实现部分的对象来设置实现部分的指针。

7、调用抽象部分的接口,实现具体的功能。

四、代码示例

cpp 复制代码
#include <iostream>
using namespace std;

class Implementor;

/**
 * @brief The Abstraction class
 * 抽象类,持有实现类指针
 */
class Abstraction
{
public:
    Abstraction(Implementor* pImpl):m_pImpl(pImpl){}
    virtual ~Abstraction(){}

    virtual void operation() = 0;
protected:
    Implementor* m_pImpl;
};

/**
 * @brief The Implementor class
 * 定义了实现部分的接口,可以是抽象类或者一个接口类
 */
class Implementor
{
public:
    virtual ~Implementor() {}
    virtual void OperationImpl() = 0;
};


/**
 * @brief The RefinedAbstraction class  定义抽象拓展部分,并在其中调用实现部分的接口
 */
class RefinedAbstraction : public Abstraction
{
public:
    RefinedAbstraction(Implementor* pImpl) : Abstraction(pImpl) {}
    virtual void operation() override{ m_pImpl->OperationImpl(); }
};


/**
 * @brief The ConcreteImplementorA class 实现具体的部分
 */
class ConcreteImplementorA : public Implementor
{
public:
    virtual void OperationImpl(){
        // 实现部分A的具体实现
        cout << __FUNCTION__ << endl;
    }
};


class ConcreteImplementorB : public Implementor
{
public:
    virtual void OperationImpl(){
        // 实现部分B的具体实现
        cout << __FUNCTION__ << endl;
    }
};


int main()
{

    Implementor* pImpl = new ConcreteImplementorA();
    Abstraction* abs = new RefinedAbstraction(pImpl);
    abs->operation();

    return 0;
}

五、总结

桥接模式适用于以下几种场景:

1、当需要避免由于实现部分和抽象部分的紧耦合关系而导致系统的维护和扩展变得困难时,可以使用桥接模式。例如,一个大型系统中有多个平台和多个应用程序,需要将它们组合起来实现特定的功能,此时就可以使用桥接模式将平台和应用程序解耦。

2、当需要在多个对象之间共享一些通用功能时,可以使用桥接模式。例如,在一个多媒体应用程序中,需要在不同的媒体之间共享一些通用的功能,比如播放、暂停、停止等,此时就可以使用桥接模式来实现共享。

3、当需要在运行时动态地切换实现部分时,可以使用桥接模式。例如,在一个视频播放器中,需要支持多种视频格式,用户可以在运行时选择不同的格式,此时就可以使用桥接模式来实现动态切换。

相关推荐
Lenyiin2 分钟前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
yuanbenshidiaos2 小时前
c++---------数据类型
java·jvm·c++
十年一梦实验室2 小时前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
taoyong0012 小时前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
这是我582 小时前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
fpcc2 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存
呆萌很3 小时前
C++ 集合 list 使用
c++
诚丞成4 小时前
计算世界之安生:C++继承的文水和智慧(上)
开发语言·c++
东风吹柳4 小时前
观察者模式(sigslot in C++)
c++·观察者模式·信号槽·sigslot
A懿轩A5 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列