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

设计模式学习[20]---桥接模式

文章目录

  • 前言
  • 1.引例
  • 2.优化
  • 3.桥接模式
  • 总结

前言

一开始遇到这个模式,容易让人联想到之前搞Linux配置网络的时候,其中的一个桥接模式。又让人想到花卉种植里面的嫁接。但后来发现不是那么回事,自己之前没听过,但实际开发中却一直在用😂。

说的直接一点,一个类的职责要单一,但是有时候它的职责不单一了,那就把不归属它的职责剥离出去,用一个新类来做,旧类持有新类指针,需要对应功能的时候,让新类指针去调用具体接口。

1.引例

试想一个案例,在工业控制领域,对于测试的数据以及波形截图等,最终都需要通过报表的方式进行展示,那么数据导出到报表上就可以分为文字数据,图片数据,附件(类似于压缩包)数据等,导出的过程均先转换成二进制数据,再导出。

在这里插入图片描述

class CExportData
{
public:virtual bool ExportData()=0;
};
class CExportTextData : public CExportData
{
public:bool ExportData() override{//先转换数据再导出//xxxxxxxxxstd::cout << "ExportTextData" << std::endl;return true;};
};
class CExportImageData : public CExportData
{
public:bool ExportData() override{//先转换数据再导出//xxxxxxxxxstd::cout << "ExportImageData" << std::endl;return true;};
};
class CExportAnnexData : public CExportData
{
public:bool ExportData() override{//先转换数据再导出//xxxxxxxxxstd::cout << "ExportAnnexData" << std::endl;return true;};
};

在Windows端,我们可以用A方法去实现转换再导出功能,但是在Linux中,这个A方法可能就不兼容了,那对于不同的操作系统就需要做不同的处理。

最简单的处理,我们在CExportTextData等子类里面去另外实现,比如新增一个函数,ExportDataOnWinodws,在ExportData函数里用一个宏判断

#ifdef _WIN32std::cout << "使用Windows的转换" << std::endl;
#endif

如果后面遇到LinuxLinuxLinuxMacOSMacOSMacOS,那就再加宏,简单好处理。

但是这样合理吗?每次均需要处理这个子类,子类不仅要导出指定类型数据,还需要兼顾不同操作系统。

2.优化

上面的引例中,我们可以看到这个CExportTextData的职责其实已经不单一了,不只是导出数据,还有对操作系统的兼容。那么这里我们能否再抽象一下?

我们将不同操作系统中数据的兼容转换进行抽象

class CParseOS
{
public:virtual bool Parse()=0;~CParseOS() {}
};
class CExportWindows:public CParseOS
{
public:bool Parse() override{ return true; };
};
class CExportLinux :public CParseOS
{
public:bool Parse() override { return true; };
};
class CExportMacOS :public CParseOS
{
public:bool Parse() override { return true; };
};

接着,让CExportData类持有CParseOS的指针,委托CParseOS进行数据转换。
那么对于导出数据类来说,这个数据的转换就不是它的职责,同时对于不同操作系统的兼容,也和数据导出类无关,数据导出类只需要负责的将转换好的数据导出即可,职责单一。

那么看一下修改后的类图与代码
在这里插入图片描述

class CExportData
{
public:virtual bool ExportData() = 0;virtual ~CExportData() {};CParseOS* m_pParseOS{ nullptr };
};
class CExportTextData : public CExportData
{
public:bool ExportData() override{m_pParseOS->Parse();std::cout << "ExportTextData" << std::endl;return true;};
};
class CExportImageData : public CExportData
{
public:bool ExportData() override{m_pParseOS->Parse();std::cout << "ExportImageData" << std::endl;return true;};
};
class CExportAnnexData : public CExportData
{
public:bool ExportData() override{m_pParseOS->Parse();std::cout << "ExportAnnexData" << std::endl;return true;};
};class CParseOS
{
public:virtual bool Parse()=0;virtual ~CParseOS() {}
};
class CExportWindows:public CParseOS
{
public:bool Parse() override{ return true; };
};
class CExportLinux :public CParseOS
{
public:bool Parse() override { return true; };
};
class CExportMacOS :public CParseOS
{
public:bool Parse() override { return true; };
};

3.桥接模式

桥接模式:将抽象部分与它的实现部分分离,是它们都可以独立的变化

这个定义还是稍微抽象了点,其实只要记住我开始说的,一个类的职责单一,如果有多个职责耦合在一起,也就是有多个维度可以影响到这个类(本例中是导出类型和操作系统两个维度),需要将它职责分离,采用委托的方式(持有指针),而非继承的方式实现,从而实现一个类只有一个影响因素导致它变化。

为什么叫桥接模式?其实我们看类图,其中CExportTextData、CExportImageData、CExportAnnexData像三个桥墩,而CExportData和CParse之间的聚合关系就是桥,而CParse下面也有三个桥墩,两个柱子通过聚合这个桥接在一起,就是桥接模式了。
在这里插入图片描述

总结

总的来说,桥接模式就是让一个类的职责尽可能单一,一个类只有一个因素可以改变这个类。通过持有指针的方式进行职责剥离,而非继承的方式增加功能。

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

相关文章:

  • 【第三次全国土壤普查】-土壤类型图报告编制及评分标准
  • python爬虫(一) ---- 静态html数据抓取
  • 《剑指Offer:单链表操作入门——从“头删”开始破解面试》
  • 网站备案号怎么查询做设计私活的网站
  • 微信小程序入门学习教程,从入门到精通,WXS语法详解(10)
  • 深圳做网站公司哪家好在线绘画网站
  • CodeX CLI安装+MCP适配与VSCode部署(Win)
  • 手写MyBatis第95弹:异常断点精准捕获MyBatis深层BUG
  • 网站的结构是什么样的鹰潭律师网站建设
  • Rust多线程详解
  • tcp 服务器的设计思路
  • 基础架构安全和云原生安全的融合~K8S安全和传统安全~K8S和安全融合~综合安全大饼
  • Python全栈(基础篇)——Day05:后端内容(dict与set+while循环+for循环+实战演示+每日一题)
  • 建设网站用什么软件排版网站建设技术和销售工资
  • UNIX下C语言编程与实践31-UNIX 进程执行新程序:system 函数的使用与内部实现机制
  • 【Java核心技术/多线程】35道Java多线程面试题与答案
  • 【AI智能体】Coze 打造AI数字人视频生成智能体实战详解
  • 网站开发外键邯郸网站开发定制
  • FreeRTOS任务同步与通信--事件标志组
  • Excel基础知识 - 导图笔记
  • Flink 执行模式在 STREAMING 与 BATCH 之间做出正确选择
  • 杭州网站制作平台公司医院网站建设存在问题
  • Python中*args与**kwargs用法解析
  • 【大模型】多智能体架构详解:Context 数据流与工作流编排的艺术
  • 描述逻辑(Description Logic)对自然语言处理深层语义分析的影响与启示
  • python爬虫(三) ---- 分页抓取数据
  • 探索大语言模型(LLM):大模型微调方式全解析
  • 【学习笔记03】C++STL标准模板库核心技术详解
  • 做网站有什么关于财务的问题网络设计工作
  • P9751 [CSP-J 2023] 旅游巴士