【设计模式】Head First 设计模式——桥模式 C++实现

news2024/11/26 4:30:00

设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。

设计思想

桥模式。将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。

动机

某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。

桥模式能够应对这种「多维度的变化」,轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度。

img

  • Abstraction Implementor为稳定的基础功能(根据维度划分为多个模块,维度影响的部分独立封装)
  • RefinedAbstractionw为第一个变化维度(Abstraction中的成员)
  • ConcreteImplementor为第二个变化维度(Implementor中的成员)

Bridge使用「对象间的组合关系」解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自纬度的变化,即“子类化”它们。

Bridge有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。

Bridge的应用一般在「两个非常强的变化维度」,有时一个类也有多于两个的变化维度,这时可以使用Bridge的扩展模式。

业务场景

你打算设计一款聊天软件Message,并打算推出两个版本:PC端版本,移动端版本,由于平台差异,所以实现具体功能的时候也会有差异。并且未来计划在两个平台上都推出两个应用版本,一个是完美版,一个是轻量Lite版。你会怎么设计?

如果应用继承去实现,先设计一个基类Message(这个Message里有一些东西是不因平台差异而变化的,比如登录,发送功能,但是有些是不一样的,比如播放声音,键入文字等),然后由于有两个平台,所以设计两个类:PCMessage, MobileMessage 继承这个Message类,然后又由于你要推出两个版本:完美版和Lite轻量版,所以又要设计两个类去分别继承PCMessage, MobileMessage类,最终的类图大概如下:

在这里插入图片描述

不难发现,这个案例中有两个维度的变化:平台不同,版本不同在影响着你的软件。如果你的软件要登录m个平台,1个软件要推出n个版本,那么最终如果采用继承,你就要设计并实现1+m+m*n个类,随着你的软件的功能迭代,版本迭代以及登录平台的增加,到最后就会造成子类爆炸。这是一个失败的设计。

而桥模式则给出了问题的答案:

代码案例

class Messager{
protected:
     MessagerImp* messagerImp;//平台
public:
    virtual void Login(string username, string password)=0;
    virtual void SendMessage(string message)=0;
    virtual void SendPicture(Image image)=0;
    virtual ~Messager(){}
};
// 不同的变化方向(业务和平台),所以分为两个类
class MessagerImp{
public:
    virtual void PlaySound()=0;
    virtual void DrawShape()=0;
    virtual void WriteText()=0;
    virtual void Connect()=0;
    virtual MessagerImp(){}
};
//平台实现 n
class PCMessagerImp : public MessagerImp{
public:
    
    virtual void PlaySound(){...}
    virtual void DrawShape(){...}
    virtual void WriteText(){...}
    virtual void Connect(){...}
};
class MobileMessagerImp : public MessagerImp{
public:
    //具体实现
    virtual void PlaySound(){...}
    virtual void DrawShape(){...}
    virtual void WriteText(){...}
    virtual void Connect(){...}
};
//业务抽象 m
class MessagerLite :public Messager {
public:
    virtual void Login(string username, string password){
        messagerImp->Connect();
        //........
    }
    virtual void SendMessage(string message){
        messagerImp->WriteText();
        //........
    }
    virtual void SendPicture(Image image){
        messagerImp->DrawShape();
        //........
    }
};
class MessagerPerfect  :public Messager { 
public:  
    virtual void Login(string username, string password){
        messagerImp->PlaySound();
        //********
        messagerImp->Connect();
        //........
    }
    virtual void SendMessage(string message){
        messagerImp->PlaySound();
        //********
        messagerImp->WriteText();
        //........
    }
    virtual void SendPicture(Image image){
        messagerImp->PlaySound();
        //********
        messagerImp->DrawShape();
        //........
    }
};
void Process(){
    //运行时装配
    MessagerImp* mImp=new PCMessagerImp();
    Messager *m =new Messager(mImp);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/949183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue项目使用svg实现一个物体沿着线条实时运动;svg图像放大缩小;svg中的文字居中显示

效果如上 html部分 <svg width"500px" height"500px" viewBox"0 0 400 400"><!-- 绘制连线 --><template v-for"(point, index) in points"><line :x1"point.x" :y1"point.y" :x2"in…

联邦学习FedAvg-基于去中心化数据的深度网络高效通信学习

随着计算机算力的提升&#xff0c;机器学习作为海量数据的分析处理技术&#xff0c;已经广泛服务于人类社会。 然而&#xff0c;机器学习技术的发展过程中面临两大挑战&#xff1a;一是数据安全难以得到保障&#xff0c;隐私泄露问题亟待解决&#xff1b;二是网络安全隔离和行业…

【HCIP】18.防火墙

区域隔离&#xff0c;以防火墙的接口为中心定义区域&#xff0c;在防火墙中不同区域互访使用策略来进行控制 NGFW&#xff0c;下一代防火墙&#xff0c;除了是否对他通过进行判断&#xff0c;也可以对安全进行判断&#xff08;例如是否是病毒&#xff0c;DDOS攻击&#xff09;…

常见的下载方式

一. 使用 window.open() 使用场景 // 1. 先封装一个实习下载的函数 export const download (path) > {window.open(下载的接口&#xff0c;例如&#xff1a;/fs/download?path path) } // 2. 使用&#xff1a;在需要下载的地方调用download函数&#xff0c;传入下载的u…

Data Rescue Professional for Mac:专业的数据恢复工具

在数字化时代&#xff0c;我们的生活和工作离不开电脑和存储设备。但是&#xff0c;意外情况时常发生&#xff0c;例如误删除文件、格式化硬盘、病毒攻击等&#xff0c;这些都可能导致重要的数据丢失。面对数据丢失&#xff0c;我们迫切需要一款可靠的数据恢复工具。今天&#…

ASEMI整流桥GBU816的原理和应用

编辑-Z 摘要&#xff1a;整流桥GBU816是一种用于将交流电转换为直流电的电子元器件。本文将从原理、结构、应用以及优点等四个方面对整流桥GBU816进行详细的阐述。 1、整流桥GBU816的原理 整流桥GBU816由四个二极管组成&#xff0c;分别连接在一个桥形电路中。当输入交流电通…

TikTok选品分析:越南7月家电销量第一,这款吸尘器凭什么?

随着经济发展&#xff0c;人们的生活向智能化、便捷化发展&#xff0c;消费者的消费喜好也随之产生变化。家电也不例外&#xff0c;传统吸尘器因其体积较大、清洁不便正逐渐被淘汰。取而代之的是手持吸尘器&#xff0c;其凭借轻便、多功能的特点迅速赢得消费者的喜爱。 过去一…

腾讯云国际代充-GPU服务器安装驱动教程NVIDIA Tesla

腾讯云国际站GPU 云服务器是基于 GPU 的快速、稳定、弹性的计算服务&#xff0c;主要应用于深度学习训练/推理、图形图像处理以及科学计算等场景。 GPU 云服务器提供和标准腾讯云国际 CVM 云服务器一致的方便快捷的管理方式。 GPU 云服务器通过其强大的快速处理海量数据的计算性…

【Python】利用python-docx生成word版本学生花名册

如图&#xff0c;可以用python创建word文档&#xff0c;生成一个学生的花名册。生成的过程&#xff1a;先下载第三方依赖包&#xff0c;安装依赖包&#xff0c;然后引入依赖文件&#xff0c;创建docx文件&#xff0c;添加标题&#xff0c;创建表头&#xff0c;创建表格正文&…

创作纪念日-我的第1024天

机缘 不知不觉已经成为创作者的第1024天啦… … 刚开始接触博客的初衷就是为了记笔记&#x1f4d2;、记总结&#x1f4dd;&#xff0c;或许对于当时就等同于是为了找工作。坚持学习并持续输出博客一年后&#xff0c;这时我发现再写博客&#xff0c;不在是为了找一份工作&…

比亚迪宋L高调亮相成都车展,媒介盒子多家媒体助阵

哈喽,大家好,今天媒介盒子小编又来跟大家分享媒体推广的干货知识了,本篇分享的主要内容是:比亚迪宋L的营销策略。 比亚迪宋L又于2023年8月25日在成都车展上首次亮相&#xff0c;该车将配备比亚迪黑科技中的CTB技术、云辇-C底盘系统和iTAC系统等&#xff0c;预计将在今年第四季…

python教程:如何写类?

目录标题 前言类的定义知识点扩展&#xff1a;构建和初始化1. __ new__(cls,[…)2. __ init__(self,[…)3. __ del__(self) 尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 类的定义 Python中&#…

正中优配:A股早盘三大股指微涨 华为概念表现活跃

周三&#xff08;8月30日&#xff09;&#xff0c;到上午收盘&#xff0c;三大股指团体收涨。其间上证指数涨0.06%&#xff0c;报3137.72点&#xff1b;深证成指和创业板指别离涨0.33%、0.12%&#xff1b;沪深两市合计成交额6423.91亿元&#xff0c;总体来看&#xff0c;两市个…

一文搞懂CAN和CAN FD总线协议

一、CAN与CAN FD的概念 1、CAN是什么 控制器局域网总线&#xff08;CAN&#xff0c;Controller Area Network&#xff09;是一种用于实时应用的串行通讯协议总线&#xff0c;它可以使用双绞线来传输信号&#xff0c;是世界上应用最广泛的现场总线之一。 CAN协议用于汽车中各种…

正中优配:创业板怎么开通

作为我国资本市场的一个重要组成部分&#xff0c;股票市场一直是出资者追逐高收益的抢手挑选。而近年来&#xff0c;创业板作为我国股票市场上的一颗新星&#xff0c;备受创业者、出资者的关注。但关于一些新手出资者来说&#xff0c;可能对“创业板怎样注册”这个问题还比较陌…

一文看懂开发者需要了解的信创概念

信创这个概念对于大家来说并不陌生&#xff0c;至少我们在海量的新闻中会时不时的听到这个概念&#xff0c;特别是在西方国家对中国进行技术封锁加剧时&#xff0c;证券市场中它还会时不时成为一个风口板块。 其实“信创”理解起来也并不困难&#xff0c;就像它的字面意思&…

手把手教你Jenkins整合Jmeter实现自动化接口测试

01、在机器上安装jmeter 下载&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本&#xff0c;启动前修改jmeter.properties 中 jmeter.save.saveservice.output_format值为xml。 编写接口测试脚本&#xff1a; …

外贸软件鞋类行业管理难点及解决方案

鞋子作为一种常见的商品&#xff0c;在出口外贸中占据着重要的地位。近几年&#xff0c;随着我国经济的建设步伐的不断加快&#xff0c;对外贸易活跃度也随之得以提升&#xff0c;中产阶层的消费人群及需求量都在不断增长&#xff0c;其中鞋业也经历了急剧的发展&#xff0c;成…

汽车自适应巡航系统控制策略研究

目 录 第一章 绪论 .............................................................................................................................. 1 1.1 研究背景及意义 ..........................................................................................…

C# 如何将使用的Dll嵌入到.exe应用程序中?

文章目录 前言详细实操简要步骤 前言 有没有想自己开发的exe保留一点神秘&#xff0c;不想让他人知道软件使用了哪些dll; 又或许是客户觉得一个软件里面的dll文件太多了&#xff0c;能不能简单一点&#xff0c;直接双击.exe就可以直接运行了&#xff0c;别搞那么多乱七八糟的。…