当前位置: 首页 > news >正文

设计模式——桥接模式(bridge)

文章目录

  • 引言
  • 代码实例
  • 总结

引言

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

在第一次看GoF的设计模式的书的时候,看到了他对bridge模式意图的描述如上,我顿感困惑,后面看架构图也依然非常疑惑,如下图:

对于这张图,你可以将Windowimp这右半边的内容理解为具体如何渲染,有多种不同的操作。而对于左半边可以理解为具体的窗口——展现什么形状和内容,以及使用什么渲染方式。
在这里插入图片描述
整一个桥接的做法其实就是使用抽象组合代替具体组合,本来每个每一个渲染方式都需要和具体窗口组成一个类,而现在通过抽象组合,我们将类的编写数量从 O(n * m) 变成 O(n + m + 2),大大的减少了类的数量。这就是bridge模式的作用。

所以现在我再去回味GoF书中的那句话,我会觉得那是一个相对狭义的表述,其实无论是什么类似,只要场景合适都可以通过抽象组合(桥接)来减少类的数量。

代码实例

每一个形状都可以有不同的颜色,如果将它们死编码组合则会类数量爆炸,所以采用桥接
在这里插入图片描述
下面是示例代码,理解要点:

  • 智能指针的构造和转移
  • 抽象组合
  • 向上转型
// 实现层次(Implementor)
class Color {
public:virtual std::string fill() const = 0;  // 返回颜色名称virtual ~Color() = default;
};// 具体实现类(ConcreteImplementor)
class Red : public Color {
public:std::string fill() const override {return "Red";}
};class Blue : public Color {
public:std::string fill() const override {return "Blue";}
};// 抽象层次(Abstraction)
class Shape {
protected:std::shared_ptr<Color> color; // 桥接:组合一个实现层对象
public:explicit Shape(std::shared_ptr<Color> c) : color(std::move(c)) {}virtual void draw() const = 0;virtual ~Shape() = default;
};// 扩充抽象层(RefinedAbstraction)
class Circle : public Shape {
public:using Shape::Shape;void draw() const override {std::cout << "Drawing a Circle in " << color->fill() << " color.\n";}
};class Rectangle : public Shape {
public:using Shape::Shape;void draw() const override {std::cout << "Drawing a Rectangle in " << color->fill() << " color.\n";}
};int main() {auto red = std::make_shared<Red>();auto blue = std::make_shared<Blue>();// 创建红色圆形和蓝色矩形Circle redCircle(red);Rectangle blueRectangle(blue);redCircle.draw();blueRectangle.draw();// 动态桥接:蓝色圆形Circle blueCircle(blue);blueCircle.draw();return 0;
}

总结

在这里插入图片描述
不必拘束于教科书的描述,依据具体场景找到最优方案来实现。

http://www.dtcms.com/a/572907.html

相关文章:

  • 阳光家园广州网站个人网站如何做即时支付
  • Arbess零基础学习 - 使用Arbess+GitLab实现.Net 项目构建/主机部署
  • 【数据结构】PriorityQueue优先队列:基于堆(heap)实现
  • PCB设计如何防止别人抄板?
  • macOS自定义安装PlatformIO Core
  • VSCode中Copilot的询问、编辑、代理有啥区别?
  • 二重积分器(Double Integrator)
  • APP与小程序分账系统是什么?资金管理新思路,合规高效分账
  • Hudi和Iceberg的Specification规范角度详细比较异同点
  • 临安网站建设杭州低价做网站
  • 肇庆市手机网站建设品牌专业做网站企业
  • 幂等性 VS 分布式锁:分布式系统一致性的两大护法 —— 从原理到实战的深度剖析
  • 初识DDD架构
  • 一次redis内存泄露故障分析
  • 计算机网络自顶向下方法32——网络层 网络层概述 转发和路由选择,数据平面和控制平面(传统方法,SDN方法) 网络服务模型
  • 深入理解MySQL_3 I/O成本
  • 哪个网站可以做验证码兼职gom传奇网站建设
  • 做网站一年能赚多少钱没有备案的网站怎么挂广告
  • vscode-ssh无法进入docker问题解决
  • iOS 应用网络权限弹窗的问题及解决方案
  • 使用 FastAPI 异步动态读取 Nacos 配置
  • 怀远做网站电话网站建设期末作业要求
  • Arbess零基础学习 - 使用Arbess+GitLab实现PHP项目构建/主机部署
  • CS144 Lab:Lab0
  • 总结做产品开发的一些通病
  • 稳定币市场格局重构:分发权正在成为新的护城河!
  • 【C语言】深入理解指针(二)
  • C++:模板的灵魂——从编译期推导到元编程的演化史
  • 开发网站用得最多的是什么语言电子商务网站开发课程
  • 顺德中小企业网站建设网站销户说明