设计模式之Bridge模式的C++实现

目录

1、Bridge模式的提出

2、Bridge模式的定义

3、Bridge模式总结

4、需求描述

5、多继承方式实现

6、使用Bridge设计模式实现


1、Bridge模式的提出

        在软件功能模块设计中,如果类的实现功能划分不清晰,使得继承得到的子类往往是随着需求的变化,子类急剧膨胀,充斥重复代码。将类要实现功能划分清楚是设计较好软件框架的关键。

2、Bridge模式的定义

        对于类的实现功能具有两个变化的维度,甚至由多个维度的变化,使用类的多继承实现方式,会使子类数目急剧膨胀。Bridge模式使用“对象间的组合关系”解耦抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度变化,即将不同的维度分别进行抽象,然后各自根据变化维度进行继承。

3、Bridge模式总结

        Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类甚至有多个变化的维度,这时使用Bridge模式的扩展模式来设计代码。

4、需求描述

手机有固有属性(材料、颜色、摄像头个数)和软件属性(开机动画、网络打印、支持app数目)。有2款A、B类型手机,A、B分别继承手机的固有属性功能。在A款基础上又有2款Higher、Pro类型,Higher、Pro分别继承手机的软件功能;在B款的基础上也有2种Higher、Pro,这2种也分别继承手机的软件功能。

5、多继承方式实现

#include <iostream>


class MobilePhone
{
public:
    //手机材质
    virtual void PhoneMaterial()=0;
    //手机颜色
    virtual void PhoneColor()=0;
    //手机大小
    virtual void PhoneCameNum()=0;

    //开机动画
    virtual void BootAnimation()=0;
    //网络打印类型
    virtual void NetPrintType()=0;
    //软件支持数目
    virtual void SoftSuppotNum()=0;

    virtual ~MobilePhone(){
    };


};

//下面的类继承关系中,不同层级的类继承不同抽象函数,可以分函数抽象一个类,见Bridge模式。

class APhoneNoraml:public MobilePhone
{
public:
    virtual ~APhoneNoraml(){};

    virtual void PhoneMaterial()override{
        std::cout << "Glass material" << std::endl;
    };

    virtual void PhoneColor()override{
        std::cout << "2 Colors" << std::endl;
    };

    virtual void PhoneCameNum()override{
        std::cout << "2 CamNum" << std::endl;
    };
};

class BPhoneNoraml:public MobilePhone
{
public:
    virtual ~BPhoneNoraml(){};

    virtual void PhoneMaterial()override{
        std::cout << "Glass material" << std::endl;
    };

    virtual void PhoneColor()override{
        std::cout << "3 Colors" << std::endl;
    };

    virtual void PhoneCameNum()override{
        std::cout << "3 CamNum" << std::endl;
    };
};


class APhoneHiger:public APhoneNoraml
{
public:
    virtual ~APhoneHiger(){};

    virtual void BootAnimation()override{
        APhoneNoraml::PhoneMaterial();
        APhoneNoraml::PhoneColor();
        APhoneNoraml::PhoneCameNum();
        std::cout << "good luck" << std::endl;
    };

    virtual void NetPrintType()override{
        std::cout << "Support base txt type" << std::endl;
    };

    virtual void SoftSuppotNum()override{
        std::cout << "Support 20 app" << std::endl;
    };
};

class BPhoneHiger:public BPhoneNoraml
{
public:
    virtual ~BPhoneHiger(){};

    virtual void BootAnimation()override{
        BPhoneNoraml::PhoneMaterial();
        BPhoneNoraml::PhoneColor();
        BPhoneNoraml::PhoneCameNum();
        std::cout << "gook lunck" << std::endl;
    };

    virtual void NetPrintType()override{
        std::cout << "Support base txt type" << std::endl;
    };

    virtual void SoftSuppotNum()override{
        std::cout << "Support 20 app" << std::endl;
    };

};

class APhonePro:public APhoneNoraml
{
public:
    virtual ~APhonePro(){};

    virtual void BootAnimation()override{
        APhoneNoraml::PhoneMaterial();
        APhoneNoraml::PhoneColor();
        APhoneNoraml::PhoneCameNum();
        std::cout << "best wishes" << std::endl;
    };

    virtual void NetPrintType()override{
        std::cout << "Support base 3 type" << std::endl;
    };

    virtual void SoftSuppotNum()override{
        std::cout << "Support 30 app" << std::endl;
    };
};

class BPhonePro:public BPhoneNoraml
{
public:
    virtual ~BPhonePro(){};

    virtual void BootAnimation()override{
        BPhoneNoraml::PhoneMaterial();
        BPhoneNoraml::PhoneColor();
        BPhoneNoraml::PhoneCameNum();
        std::cout << "best wishes" << std::endl;
    };

    virtual void NetPrintType()override{
        std::cout << "Support base 3 type" << std::endl;
    };

    virtual void SoftSuppotNum()override{
        std::cout << "Support 30 app" << std::endl;
    };

};

int main()
{
    MobilePhone* higherA = new APhoneHiger();
    higherA->BootAnimation();
    higherA->NetPrintType();
    higherA->SoftSuppotNum();
    delete higherA;
    higherA = nullptr;


    MobilePhone* proA = new APhonePro();
    proA->BootAnimation();
    proA->NetPrintType();
    proA->SoftSuppotNum();
    delete proA;
    proA = nullptr;
    return 0;
}

运行结果如下:

6、使用Bridge设计模式实现

#include <iostream>

//将第一个变化维度的三个函数抽象成一个类,供第二层继承使用
class MobilePhone
{
public:
    //手机材质
    virtual void PhoneMaterial()=0;
    //手机颜色
    virtual void PhoneColor()=0;
    //手机大小
    virtual void PhoneCameNum()=0;
    virtual ~MobilePhone(){}
};

//将第二个变化维度的三个函数抽象出一个类,供第三层继承使用
class MobileSoft
{
public:
    MobileSoft(MobilePhone* p):Imp(p){};
    MobilePhone *Imp;
    //开机动画
    virtual void BootAnimation()=0;
    //网络打印类型
    virtual void NetPrintType()=0;
    //软件支持数目
    virtual void SoftSuppotNum()=0;
};

class APhoneNoraml:public MobilePhone
{
public:
    virtual ~APhoneNoraml(){};

    virtual void PhoneMaterial()override{
        std::cout << "Glass material" << std::endl;
    };

    virtual void PhoneColor()override{
        std::cout << "2 Colors" << std::endl;
    };

    virtual void PhoneCameNum()override{
        std::cout << "2 CamNum" << std::endl;
    };
};

class BPhoneNoraml:public MobilePhone
{
public:
    virtual ~BPhoneNoraml(){};

    virtual void PhoneMaterial()override{
        std::cout << "Glass material" << std::endl;
    };

    virtual void PhoneColor()override{
        std::cout << "3 Colors" << std::endl;
    };

    virtual void PhoneCameNum()override{
        std::cout << "3 CamNum" << std::endl;
    };
};

//在第三层继承关系处使用对象组合。
class PhoneHiger:public MobileSoft
{
public:
    PhoneHiger(MobilePhone *p):MobileSoft(p){};
    virtual ~PhoneHiger(){};

    virtual void BootAnimation()override{
        Imp->PhoneMaterial();
        Imp->PhoneColor();
        Imp->PhoneCameNum();
        std::cout << "good luck" << std::endl;
    };

    virtual void NetPrintType()override{
        std::cout << "Support base txt type" << std::endl;
    };

    virtual void SoftSuppotNum()override{
        std::cout << "Support 20 app" << std::endl;
    };
};


class PhonePro:public MobileSoft
{
public:
    PhonePro(MobilePhone *p):MobileSoft(p){};
    virtual ~PhonePro(){};

    virtual void BootAnimation()override{
        Imp->PhoneMaterial();
        Imp->PhoneColor();
        Imp->PhoneCameNum();
        std::cout << "best wishes" << std::endl;
    };

    virtual void NetPrintType()override{
        std::cout << "Support base 3 type" << std::endl;
    };

    virtual void SoftSuppotNum()override{
        std::cout << "Support 30 app" << std::endl;
    };
};

int main()
{
    std::cout << " ************** PhoneHiger ************** " << std::endl;
    MobilePhone *normalA = new APhoneNoraml();
    MobileSoft *higherA = new PhoneHiger(normalA);
    higherA->BootAnimation();
    higherA->NetPrintType();
    higherA->SoftSuppotNum();

    std::cout << "\n ************** PhonePro ************** " << std::endl;
    MobilePhone *normalPro = new APhoneNoraml();
    MobileSoft *proA = new PhonePro(normalPro);
    proA->BootAnimation();
    proA->NetPrintType();
    proA->SoftSuppotNum();
    return 0;
}

运行结果如下:

       上面的代码将不同的变化维度分别抽象成一个类,供子类继承;并且其中一个维度的继承关系用“类成员是基类对象”组合的方式进行替代,使功能类代码具有良好的扩展性,也遵循单一职责原则。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Win10语言设置 - 显示语言和应用语言

前言 Win10的语言设置可以设置显示语言和应用语言。其中&#xff0c;显示语言用于显示系统文字&#xff1b;应用语言用于应用程序显示文字。下文介绍如何设置。 显示语言 打开系统设置&#xff0c;选择时间和语言&#xff0c;如下图&#xff1a; 修改Windows显示语言即可更…

搭建Django+pyhon+vue自动化测试平台

Django安装 使用管理员身份运行pycharm使用local 1 pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple 检查django是否安装成功 1 python -m django --version 创建项目 1 1 django-admin startproject test cd 切换至创建的项目中启动django项目…

linux文本三剑客---grep,sed,awk

目录 grep 什么是grep&#xff1f; grep实例演示 命令参数&#xff1a; 案例演示&#xff1a; sed 概念&#xff1a; 常用选项&#xff1a; 案例演示&#xff1a; awk 概念&#xff1a; awk常用命令选项&#xff1a; awk变量&#xff1a; 内置变量 自定义变量 a…

Java课题笔记~ JavaWeb概述/开发基础

JavaWeb概述/开发基础 1.XML基础 &#xff08;1&#xff09;XML概述 &#xff08;2&#xff09;XML语法 &#xff08;3&#xff09;DTD约束 &#xff08;4&#xff09;Schema约束&#xff08;XML Schema 比 DTD 更强大&#xff09; 2.Web基础知识 Web是一个分布式的超媒…

1、如何实现两台电脑之间数据相互读写

一、确保两台电脑在同一个局域网中&#xff0c;可以使用网线【动态配置】进行两台电脑互连。 二、静态配置: 将IP地址和网关设为192.168.0.1&#xff0c;目的是让这台电脑做另一台电脑的网关&#xff0c;子网掩码一点击会自动添加。第二台电脑同样打开设置&#xff0c;此处IP地…

MySQL之深入InnoDB存储引擎——Undo页

文章目录 一、UNDO日志格式1、INSERT操作对应的UNDO日志2、DELETE操作对应的undo日志3、UPDATE操作对应的undo日志1&#xff09;不更新主键2&#xff09;更新主键的操作 3、增删改操作对二级索引的影响 二、UNDO页三、UNDO页面链表四、undo日志具体写入过程五、回滚段1、回滚段…

初中信息技术考试编程题,初中信息技术python教案

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;初中信息技术python编程题库 网盘&#xff0c;初中信息技术python编程教学&#xff0c;今天让我们一起来看看吧&#xff01; ID:12450455 资源大小&#xff1a;934KB 资料简介: 2019-2020学年初中信息技术【轻松备课】P…

阔别三年,领先回归!别克LPGA锦标赛申城十月再启高球盛会

2023年8月4日——2023年金秋十月&#xff0c;阔别中国赛场已久的别克LPGA锦标赛将强势归来&#xff0c;于10月12日至15日在上海旗忠花园高尔夫俱乐部再次拉开帷幕。作为三年来首个回归、同时也是今年国内唯一开赛的国际顶级高尔夫职业赛事&#xff0c;别克LPGA锦标赛将吸引全世…

vscode 设置滑条颜色

1. 默认的滑条是灰黑色的&#xff0c;很难看的清 2. 左下角&#xff0c;打开VS Code 设置功能 3. 输入命令 workbench color&#xff0c;回车 4. 找到工作台&#xff1a;自定义颜色设置&#xff0c;打开设置文件 setting.json 5. 打开配置文件 6. 添加颜色配置 "workben…

谷歌推出AI模型机器人RT2 将文本和图像输出为机器人动作

去年年底&#xff0c;ChatGPT火遍全球&#xff0c;全世界都见识了大语言模型的强大力量。人们对大模型不再陌生&#xff0c;开始使用基于大模型的应用绘画、作图、搜索资料、设计剧情等&#xff0c;而妙用不止于此。谷歌推出了Robotics Transformer 2(RT2)&#xff0c;这是一个…

JSON.stringify循环引用问题

前端使用到对象的深度复制通常会简单的使用JSON.parse(JSON.stringify(obj))实现 &#xff08;浅表复制会用Array.from、Object.assign、Object.create静态方法实现&#xff09;&#xff0c;但在对象存在循环引用的情况下&#xff08;比如&#xff1a;树结构中子对象存在parent…

API接口:企业信息核验

企业信息核验是现代企业管理中必不可少的一项业务&#xff0c;它可以帮助企业做出正确的决策。在这篇文章里&#xff0c;我们将会介绍如何使用API接口来对企业信息进行核验&#xff0c;并实现快捷、准确的查询。 一、API接口 在这里我们使用的是挖数据提供的企业信息核验API接…

sk_buff操作函数学习

一. 前言 内核提供了大量实用的操作sk_buff的函数&#xff0c;在开发网络设备驱动程序和修改网络协议栈代码时需要用到。这些函数从功能上可以分为三类&#xff1a;创建&#xff0c;释放和复制socket buffer&#xff1b;操作sk_buff结构中的参数和指针&#xff1b;管理socket b…

Flink作业调度的9种状态

1.什么是作业调度 Flink 通过 Task Slots 来定义执行资源。每个 TaskManager 有一到多个 task slot&#xff0c;每个 task slot 可以运行一条由多个并行 task 组成的流水线。 这样一条流水线由多个连续的 task 组成&#xff0c;比如并行度为 n 的 MapFunction 和 并行度为 n 的…

【Shell】基础语法(三)

文章目录 一、Shell基础语法1. 位置参数和特殊变量2. 输入输出3. 管道4. 文件重定向5. 函数6. 脚本调试方法 二、Shell高级和正则表达式1. sort命令2. uniq命令3. wc命令4. grep命令5. find命令6. xargs7. sed命令8. crontab 一、Shell基础语法 1. 位置参数和特殊变量 $0 …

宝塔面板点击SSL闪退打不开怎么解决?

宝塔Linux面板点击SSL证书闪退如何解决&#xff1f;旧版本的宝塔Linux面板确实存在这种情况&#xff0c;如何解决&#xff1f;升级你的宝塔Linux面板即可。新手站长分享宝塔面板SSL闪退的解决方法&#xff1a; 宝塔面板点击SSL证书闪退解决方法 问题&#xff1a;宝塔Linux面板…

机器学习复习题

1 单选题 ID3算法、C4.5算法、CART算法都是&#xff08; &#xff09;研究方向的算法。 A . 决策树 B. 随机森林 C. 人工神经网络 D. 贝叶斯学习 参考答案&#xff1a;A &#xff08; &#xff09;作为机器学习重要算法之一&#xff0c;是一种利用多个树分类器进行分类和预测…

[OnWork.Tools]系列 07-Web浏览器

简介 简易的web浏览器,适合临时使用 组件安装 第一次使用时可能需要安装相关组件 点击确定 会打开官方地址 WebView2 - Microsoft Edge Developer 点击立即下载 跳转到新的地址 WebView2 - Microsoft Edge Developer 有外网的选择第一个,无网络的在有网络的电脑打开后选择…

jenkins pipeline项目

回到目录 将练习jenkins使用pipeline项目&#xff0c;结合k8s发布一个简单的springboot项目 前提&#xff1a;jenkins的环境和k8s环境都已经安装完成&#xff0c;提前准备了gitlab和一个简单的springboot项目 创建一个流水线项目 流水线中选择git&#xff0c;并选择gitlab的…

MongoDB数据库操作及操作命令

目录 一、基础概念 二、安装mongod 三、命令交互数据库 &#xff08;1&#xff09;数据库命令 &#xff08;2&#xff09;集合命令 &#xff08;3&#xff09;文档命令 四、Mongoose &#xff08;1&#xff09;增加一条数据 &#xff08;2&#xff09;插入多个数据 &am…