桥模式(Bridge Pattern)

定义

桥模式是一种结构型设计模式,其主要目的是将抽象部分与实现部分分离,使它们可以独立变化。这样可以更灵活地组合不同的抽象部分和实现部分,而不需要修改已有的代码。

桥模式基本结构

桥模式的组成

  1. 抽象化(Abstraction)角色:定义抽象接口,并维护一个对实现化对象的引用。
  2. 扩展抽象化(Refined Abstraction)角色:是抽象化角色的具体实现,实现化角色和抽象化角色之间的桥梁接口的实现。
  3. 实现化(Implementor)角色:定义实现接口的接口。
  4. 具体实现化(Concrete Implementor)角色:扩展实现化角色,实现实现化接口。

Abstraction(抽象类)

cpp 复制代码
class Abstraction {
protected:
    Implementor* implementor;

public:
    Abstraction(Implementor* imp) : implementor(imp) {}
    virtual void operation() = 0;
};

RefinedAbstraction(具体抽象类)

cpp 复制代码
class RefinedAbstraction : public Abstraction {
public:
    RefinedAbstraction(Implementor* imp) : Abstraction(imp) {}
    virtual void operation() override {
        // additional code
        implementor->operationImpl();
        // additional code
    }
};

Implementor(实现类接口)

cpp 复制代码
class Implementor {
public:
    virtual void operationImpl() = 0;
};

ConcreteImplementor(具体实现类)

cpp 复制代码
class ConcreteImplementorA : public Implementor {
public:
    virtual void operationImpl() override {
        // 实现 A 的具体操作
    }
};

class ConcreteImplementorB : public Implementor {
public:
    virtual void operationImpl() override {
        // 实现 B 的具体操作
    }
};

示例

考虑一个图形绘制的场景,其中有不同的图形(圆形、矩形)和不同的颜色(红色、蓝色)。每种图形都有绘图需要,而绘图需要设置颜色。所以这里绘制是抽象,设置颜色为具体实现。

我们可以使用桥模式来处理这种情况。

Abstraction - 图形抽象类

cpp 复制代码
class Shape {
protected:
    Color* color;

public:
    Shape(Color* col) : color(col) {}
    virtual void draw() = 0;
};

RefinedAbstraction - 具体图形类

cpp 复制代码
class Circle : public Shape {
public:
    Circle(Color* col) : Shape(col) {}
    virtual void draw() override {
        std::cout << "Draw Circle ";
        color->applyColor();
    }
};

class Rectangle : public Shape {
public:
    Rectangle(Color* col) : Shape(col) {}
    virtual void draw() override {
        std::cout << "Draw Rectangle ";
        color->applyColor();
    }
};

Implementor - 颜色接口

cpp 复制代码
class Color {
public:
    virtual void applyColor() = 0;
};

ConcreteImplementor - 具体颜色类

cpp 复制代码
class RedColor : public Color {
public:
    virtual void applyColor() override {
        std::cout << "with Red Color\n";
    }
};

class BlueColor : public Color {
public:
    virtual void applyColor() override {
        std::cout << "with Blue Color\n";
    }
};

使用桥模式,我们可以独立地变化图形和颜色,不影响彼此的变化。例如

cpp 复制代码
int main() {
    Color* red = new RedColor();
    Color* blue = new BlueColor();

    Shape* circle = new Circle(red);
    Shape* rectangle = new Rectangle(blue);

    circle->draw();        // Draw Circle with Red Color
    rectangle->draw();     // Draw Rectangle with Blue Color

    // 清理内存...
    
    return 0;
}

在这个例子中,桥模式使得我们可以轻松地添加新的图形或颜色,而不需要修改已有的类。这样的设计符合开闭原则,使得系统更加灵活和可扩展。

相关推荐
morning_judger1 天前
【设计模式系列】桥接模式(十三)
java·设计模式·桥接模式
无敌岩雀2 天前
C++设计模式结构型模式———桥接模式
c++·设计模式·桥接模式
ROS机器人学习与交流4 天前
虚拟机桥接模式连不上,无法进行SSH等远程操作
桥接模式
wrx繁星点点8 天前
桥接模式:解耦抽象与实现的利器
android·java·开发语言·jvm·spring cloud·intellij-idea·桥接模式
zzzhpzhpzzz12 天前
设计模式——桥接模式
算法·设计模式·桥接模式
dc爱傲雪和技术14 天前
桥接模式、NAT模式 和 主机模式(Host-Only)区别
网络·桥接模式
wyh10611514 天前
07 设计模式-结构型模式-桥接模式
java·设计模式·桥接模式·1024程序员节
自古圣贤皆寂寞15 天前
VirtualBox虚拟机桥接模式固定ip详解
桥接模式·固定ip·virtualbox虚拟机桥接·虚拟机动态ip·桥接模式有什么好处·虚拟机网络设置推荐
X先生__15 天前
基于SpringBoot设计模式之结构型设计模式·桥接模式
spring boot·设计模式·桥接模式
Mr. zhihao18 天前
桥接模式详解与代码实现
java·开发语言·桥接模式