[C++][设计模式][桥模式]详细讲解

news2024/11/16 11:57:36

目录

  • 1.动机
  • 2.模式定义
  • 3.要点总结
  • 4.代码感受
    • 1.代码一
    • 2.代码二


1.动机

  • 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度, 乃至多个纬度的变化
  • 如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?

2.模式定义

  • 定义:将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化
  • 结构
    请添加图片描述

3.要点总结

  • Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化
    • 所谓抽象和实现沿着各自纬度的变化,即:“子类化”它们
  • Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差
    • Bridge模式是比多继承方案更好的解决方法
  • Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类也有多于两个的变化维度,这时可以使用Bridge的扩展模式

4.代码感受

1.代码一

class Messager
{
public:
    virtual void Login(string username, string password) = 0;
    virtual void SendMessage(string message) = 0;
    virtual void SendPicture(Image image) = 0;

    virtual void PlaySound() = 0;
    virtual void DrawShape() = 0;
    virtual void WriteText() = 0;
    virtual void Connect() = 0;
    
    virtual ~Messager(){}
};

//平台实现
class PCMessagerBase : public Messager
{
public:
    virtual void PlaySound()
    {
        //**********
    }
    virtual void DrawShape()
    {
        //**********
    }
    virtual void WriteText()
    {
        //**********
    }
    virtual void Connect()
    {
        //**********
    }
};

class MobileMessagerBase : public Messager
{
public:
    
    virtual void PlaySound()
    {
        //==========
    }
    virtual void DrawShape()
    {
        //==========
    }
    virtual void WriteText()
    {
        //==========
    }
    virtual void Connect()
    {
        //==========
    }
};

//业务抽象
class PCMessagerLite : public PCMessagerBase 
{
public:
    
    virtual void Login(string username, string password)
    {
        PCMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message)
    {
        PCMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image)
    {
        PCMessagerBase::DrawShape();
        //........
    }
};

class PCMessagerPerfect : public PCMessagerBase 
{
public:
    virtual void Login(string username, string password)
    {
        PCMessagerBase::PlaySound();
        //********
        PCMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message)
    {
        
        PCMessagerBase::PlaySound();
        //********
        PCMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image)
    {
        
        PCMessagerBase::PlaySound();
        //********
        PCMessagerBase::DrawShape();
        //........
    }
};

class MobileMessagerLite : public MobileMessagerBase 
{
public:
    virtual void Login(string username, string password)
    {
        MobileMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message)
    {
        MobileMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image)
    {
        MobileMessagerBase::DrawShape();
        //........
    }
};

class MobileMessagerPerfect : public MobileMessagerBase 
{
public:
    virtual void Login(string username, string password)
    {
        MobileMessagerBase::PlaySound();
        //********
        MobileMessagerBase::Connect();
        //........
    }
    virtual void SendMessage(string message)
    {
        MobileMessagerBase::PlaySound();
        //********
        MobileMessagerBase::WriteText();
        //........
    }
    virtual void SendPicture(Image image)
    {
        MobileMessagerBase::PlaySound();
        //********
        MobileMessagerBase::DrawShape();
        //........
    }
};

void Process()
{
        //编译时装配
        Messager *m =
            new MobileMessagerPerfect();
}

2.代码二

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(){}
};


//平台实现
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()
    {
        //==========
    }
};

//业务抽象
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/1860855.html

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

相关文章

数据可视化如何为智慧农业带来变革

数据可视化如何为智慧农业保驾护航?随着农业现代化的深入推进,智慧农业应运而生,通过集成物联网、大数据、人工智能等先进技术,实现农业生产的数字化、智能化和高效化。而在这一过程中,数据可视化技术作为重要的工具&a…

新品发布 | TC1018Pro和TC1034Pro正式发布,功能升级,多设备时间同步

新品发布/New products release 同星智能最新推出TC1018Pro和TC1034Pro两款产品,新版本在保留原来基本功能的基础上做了升级,主要新增IO功能、错误帧ID检测、多设备间时间同步等功能。 接下来,让我们看看这两款产品带来了哪些具体功能升级&a…

计算机网络——数据链路层(数据链路层概述及基本问题)

链路、数据链路和帧的概念 数据链路层在物理层提供服务的基础上向网络层提供服务,其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。 链路(…

【ai】tx2 nx : yolov4加入initLibNvInferPlugins构建

先说结果:make 成功 插件头文件 复制一份: /** Copyright 1993-2021 NVIDIA Corporation. All rights reserved.** NOTICE TO LICENSEE:** This source code and/or documentation ("Licensed Deliverables") are* subject to NVIDIA intellectual property right…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 6月25日,星期二

每天一分钟,知晓天下事! 2024年6月25日 星期二 农历五月二十 1、 发改委:鼓励限购城市放宽车辆购买限制,增发购车指标。 2、 最高法:新反垄断民事诉讼司法解释发布,7月1日起施行。 3、 生态环境部&#x…

python通讯录管理系统

项目演示 有偿项目,需要可以加我微信

centos7安装nacos并配置mysql

centos7安装nacos并配置mysql 1 预置条件2 下载nacos2.1 先下载压缩包再上传到虚拟机2.2 在虚拟机上直接下载2.3 数据库环境准备2.4 修改nacos配置文件2.5 启动nacos 3 启动可能遇到报错4 访问测试4.1 解决页面打不开4.2 登陆测试 1 预置条件 在虚拟机上安装jdk8:h…

使用容器部署redis_设置配置文件映射到本地_设置存储数据映射到本地_并开发java应用_连接redis---分布式云原生部署架构搭建011

可以看到java应用的部署过程,首先我们要准备一个java应用,并且我们,用docker,安装一个redis 首先我们去start.spring.io 去生成一个简单的web项目,然后用idea打开 选择以后下载 放在这里,然后我们去安装redis 在公共仓库中找到redis . 可以看到它里面介绍说把数据放到了/dat…

【Pandas驯化-16】一文搞懂Pandas中高性能query、eval函数技巧

【Pandas驯化-16】一文搞懂Pandas中高性能query、eval函数技巧 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 相关内容文档获取 微信公众…

AIGC Browser正式发布

什么是AIGC Browser AIGC Browser是一个超级桌面软件运行时助手,其使命是为每一个桌面应用软件在运行时提供一个“Built-in Web Browser”,使得桌面软件之中的“原生窗口对象”成为一类“超级div”元素,进而桌面应用成为一款“超级Web浏览器…

玩转Linux dd命令:备份与恢复指南

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 玩转Linux dd命令:备份与恢复指南 前言简介基本语法常用选项 示例3. 高级用法 性能优…

微深节能 料场堆取料无人操作系统 格雷母线

格雷母线高精度位移检测系统在料场堆取料中的应用是一个重要的技术进步,它极大地提升了堆取料作业的自动化和精确性。 一、格雷母线定位系统概述 格雷母线高精度位移测量系统,包括格雷母线、天线箱、地址解码器、地址编码器四个部分组成。 格雷母线类似一…

圈子系统搭建教程,以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP小程序H5

圈子是一款社区与群组的交友工具。你可以在软件内创造一个兴趣的群组从而达到按圈子来交友的效果用户可以根据自己的兴趣爱好。 1. 创建圈子 轻松创建专属圈子,支持付费型社群。 2. 加入圈子 加入不同圈子,设置不同名片,保护隐私。 3. 定…

权威VS实战:如何权衡六西格玛培训证书的两种价值?

当我们谈论六西格玛培训证书时,我们不得不提到两种截然不同的“身份象征”。一种是由专业培训机构颁发的证书,这种证书在质量管理领域同样具有不可忽视的价值。 培训机构颁发的六西格玛证书,不仅代表着你已经完成了他们精心设计的培训课程&a…

分布式事务之Seata框架

文章目录 一、分布式事务1.什么是分布式事务2.分布式事务的思想 二、Seata框架1.认识Seata2.事务管理三个重要角色3.事务模式4.二阶段提交5.XA模式6.AT模式7.AT模式与XA模式的区别8. TCC 模式9.Saga 模式 一、分布式事务 1.什么是分布式事务 传统的单体项目被拆分成多个微服务…

七牛云 Miku 快直播,陪你一起看球!

足球,作为全球最受欢迎的运动之一,每一次大赛都是球迷心中的狂欢,每一场比赛都记录着足球历史的精彩。 2000 年,特雷泽盖的金球,照亮了法兰西的足球梦想。 2004 年,查理斯特亚斯的头槌破门,成就…

数字化营销师:企业数字化转型中的关键力量

在当今数字化浪潮席卷全球的时代,企业面临着又新又难的挑战与机遇。数字化转型已成为企业提升竞争力、实现可持续发展的必然选择。而在这一过程中,数字化营销师正以其独特的专业技能和创新思维,发挥着不可或缺的重要作用。蚓链数字化营销系统…

C#——里氏转换详情

里氏转换 里氏转换就是派生类的对象赋值给父类对象,反之则不行 实例 : 先创键一个类然后继承 调用

方案论证项目分析

文章目录 1. 介绍2. 分析2.1. 场景加载2.2. 地形平压2.3. 模型放置2.4. 绘制区域2.5. 查看方案2.6. 数据库的字段2.7. 接口 3. 难点3.1. 调整模型的位置3.2. 旋转 1. 介绍 这是一个涉及Cesium.js(一个用于Web的3D地球和地图的JavaScript库)和前后端交互…

Reqable抓包工具

今天给大家最近一个好用的Api抓包工具,最重要的是它还是中文版本的 电脑 手机 都可以抓 这是官网地址:https://reqable.com/zh-CN/docs/getting-started/ 进入后我们点击【下载】根据自己电脑需求选择对应版本,我的是window10,选…