桥接模式(Bridge)——结构型模式

桥接模式(Bridge)——结构型模式

桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。

假如有三个类Circletrianglerectangle,现在要在此基础上为每个类新添加三个颜色属性bluegreenred ,这时候我们用继承的方式实现,则还需新添加9个类,以保证所有组合。如果再加一个维度呢?比如说再添加三种边框实线虚线双线,那么就需要再添加27个类。类的数量呈指数型上升,在设计上称之为类爆炸

在这里插入图片描述

桥接模式通过将继承改为组合的方式来解决这个问题。 具体来说就是将各个维度抽象出来,并选择一个维度作为基座,这样就可以在基维度类中引用其它类,从而使得一个类不必拥有所有的状态和行为。

例如上例,可以抽象出形状颜色 两个维度,选择形状作为基座并包含颜色的引用引用充当一个桥梁的作用,这样就可以灵活的进行组合。对于三个维度各三个属性的情况,只需要定义9个类即可(不算抽象类),从而避免继承模式导致的类爆炸。

C++ 实例:

在这里插入图片描述

在这里插入图片描述

#include <iostream>
#include <string>

// 颜色接口
class Color {
public:
    virtual std::string getColor() = 0;
    virtual ~Color() {}
};

// 红色实现类
class RedColor : public Color {
public:
    std::string getColor() override {
        return "Red";
    }
};

// 蓝色实现类
class BlueColor : public Color {
public:
    std::string getColor() override {
        return "Blue";
    }
};

// 形状接口
class Shape {
protected:
    Color* color;
public:
    Shape(Color* color) : color(color) {}

    virtual void draw() = 0;
    virtual ~Shape() {}
};

// 圆形
class Circle : public Shape {
public:
    Circle(Color* color) : Shape(color) {}

    void draw() override {
        std::cout << "Drawing Circle with color " << color->getColor() << std::endl;
    }
};

// 矩形
class Rectangle : public Shape {
public:
    Rectangle(Color* color) : Shape(color) {}

    void draw() override {
        std::cout << "Drawing Rectangle with color " << color->getColor() << std::endl;
    }
};

int main() {
    Color* red = new RedColor();
    Color* blue = new BlueColor();

    Shape* redCircle = new Circle(red);
    Shape* blueRectangle = new Rectangle(blue);

    redCircle->draw();
    blueRectangle->draw();

    delete blueRectangle;
    delete redCircle;
    delete blue;
    delete red;

    return 0;
}

相关推荐

  1. 模式 (Bridge Pattern)

    2024-05-14 12:50:08       53 阅读
  2. 模式Bridge Pattern)

    2024-05-14 12:50:08       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-14 12:50:08       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-14 12:50:08       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-14 12:50:08       82 阅读
  4. Python语言-面向对象

    2024-05-14 12:50:08       91 阅读

热门阅读

  1. Spring new对象时注解失效

    2024-05-14 12:50:08       36 阅读
  2. [开发] Oh My Zsh 安装pnpm插件

    2024-05-14 12:50:08       39 阅读
  3. content-type之multipart/form-data和application/json比较

    2024-05-14 12:50:08       29 阅读
  4. 2、MySQL总结

    2024-05-14 12:50:08       32 阅读
  5. Prompt提示词的技巧

    2024-05-14 12:50:08       27 阅读
  6. 删除有序数组中的重复项

    2024-05-14 12:50:08       37 阅读
  7. 从零学算法994

    2024-05-14 12:50:08       30 阅读
  8. C++|内存管理(2)

    2024-05-14 12:50:08       27 阅读