设计模式--桥接模式(Bridge Pattern)

桥接模式(Bridge Pattern)是一种结构型设计模式,它主要是用于将抽象部分与实现部分分离,使它们可以独立地变化。

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

  1. Abstraction(抽象类):定义抽象类的接口,它维护对Implementor的引用。
  2. RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口。
  3. Implementor(实现类接口):定义实现类的接口,该接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同。
  4. ConcreteImplementor(具体实现类):具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现。

桥接模式的主要优点是:

  • 分离抽象接口及其实现部分:提供抽象和实现之间的桥梁结构,而这个桥梁就是该模式的核心------抽象和实现分离,这也是桥接模式的主要特点。
  • 提高了系统的可扩充性:抽象和实现可以独立扩展,不会相互影响,由于程序的抽象化,增加系统功能方便。
  • 实现细节对客户透明,可以对用户隐藏实现细节。

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

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  • 当一个系统不希望使用继承或因为多层继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

以下是一个简单的C++实现的桥接模式(Bridge Pattern)示例:

c 复制代码
#include <iostream>

// 实现部分的抽象
class Implementor {
public:
    virtual void operationImpl() = 0;
    virtual ~Implementor() {}
};

// 具体实现A
class ConcreteImplementorA : public Implementor {
public:
    void operationImpl() override {
        std::cout << "Concrete Implementor A operation..." << std::endl;
    }
};

// 具体实现B
class ConcreteImplementorB : public Implementor {
public:
    void operationImpl() override {
        std::cout << "Concrete Implementor B operation..." << std::endl;
    }
};

// 抽象部分
class Abstraction {
public:
    Abstraction(Implementor* impl) : impl_(impl) {}
    virtual void operation() {
        impl_->operationImpl();
    }
    virtual ~Abstraction() { delete impl_; }

private:
    Implementor* impl_;
};

// 扩展抽象部分
class RefinedAbstraction : public Abstraction {
public:
    RefinedAbstraction(Implementor* impl) : Abstraction(impl) {}
    void operation() override {
        std::cout << "Refined ";
        Abstraction::operation();
    }
};

int main() {
    Abstraction* abstractionA = new RefinedAbstraction(new ConcreteImplementorA());
    abstractionA->operation();

    Abstraction* abstractionB = new RefinedAbstraction(new ConcreteImplementorB());
    abstractionB->operation();

    delete abstractionA;
    delete abstractionB;

    return 0;
}

在这个例子中,Implementor是实现部分的抽象,定义了operationImpl接口。ConcreteImplementorA和ConcreteImplementorB是具体实现,实现了operationImpl接口。

Abstraction是抽象部分,它维护了一个对实现部分的引用,这个引用可以是抽象实现类,也可以是具体实现类。在operation接口中,抽象部分会调用实现部分的operationImpl接口。

RefinedAbstraction是扩展抽象部分,它继承了抽象部分,并可以添加新的接口。

通过这种方式,我们可以将抽象部分和实现部分分离,使它们可以独立地变化。

帮助理解:

可以使用"毛笔" 与 "蜡笔" 做比喻。

"大小"和"颜色" 是两个独立变化的维度。

例如,大小型号有 小 中 大,颜色有3种 红 蓝 黄。

对于毛笔,自带大小属性,增加一支毛笔,结合颜色,有多少种颜色,就有多少种画笔使用方式。

对于蜡笔,大小和颜色耦合在一起,要想达到与毛笔一样的效果,有多少种颜色,就需要增加多少个蜡笔。

相关推荐
橘颂TA几秒前
【剑斩OFFER】算法的暴力美学——leetCode 946 题:验证栈序列
c++·算法·leetcode·职场和发展·结构与算法
闻缺陷则喜何志丹3 分钟前
【状态机动态规划】3686. 稳定子序列的数量|1969
c++·算法·动态规划·力扣·状态机动态规划
茶本无香13 分钟前
设计模式之二—原型模式:灵活的对象克隆机制
java·设计模式·原型模式
寻星探路14 分钟前
【算法通关】双指针技巧深度解析:从基础到巅峰(Java 最优解)
java·开发语言·人工智能·python·算法·ai·指针
wen__xvn15 分钟前
力扣第 484 场周赛
算法·leetcode·职场和发展
YuTaoShao27 分钟前
【LeetCode 每日一题】865. 具有所有最深节点的最小子树——(解法一)自顶向下
算法·leetcode·职场和发展
GISer_Jing36 分钟前
Nano Banana+LoveArt三大核心功能解析:重构AI设计全链路,让创意落地更高效
人工智能·设计模式·aigc
寻星探路41 分钟前
【算法专题】哈希表:从“两数之和”到“最长连续序列”的深度解析
java·数据结构·人工智能·python·算法·ai·散列表
!停1 小时前
C语言单链表
c语言·数据结构·算法
闻缺陷则喜何志丹1 小时前
【回文 字符串】3677 统计二进制回文数字的数目|2223
c++·算法·字符串·力扣·回文