首页 > 编程语言 >C++ 设计模式之桥接模式

C++ 设计模式之桥接模式

时间:2023-07-07 13:44:27浏览次数:41  
标签:run 桥接 电脑 C++ 实现 软件 设计模式 public

设计模式之桥接模式

桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里说的实现分离,并不是说然抽象类与派生类分离,这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。其UML图如下:

 

  结合上图理解一下其定义。抽象部分指的是Abstraction或者RefinedAbstraction。实现部分指的是Implementor。以为抽象部分得实现有多种变化,为了减少耦合,所以把实现部分得变化封装起来,通过组合得方式实现。这就是定义中说得将抽象部分与它得实现部分分离。而定义中说得实现指得是抽象类和它得派生类用来实现自己得对象就是对变化封装后得类,即Implementor。举个例子就很好理解啦。就拿电脑来举例子吧。电脑又有微软得电脑,联想得电脑。而电脑上可以运行游戏,也可以运行记事本等软件。有两种方式可以实现电脑产品,如下:

方式一:

这种方式耦合性太高,比如像添加一种软件,需要添加微软电脑的软件和联想电脑的软件。同样的像添加一种电脑,也要添加相应的软件。如果要修改一种软件,则要修改很多软件。

方式二,那就是电脑是电脑,软件是软件两者分离。如下图:

 

  很明显方式二耦合性底,容易维护和扩展。这里电脑就相当于抽线,而软件则相当于实现。总的来说就是桥接模式主要是实现系统可能有多个角度分类,每一种分类都有可能变化。那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

以电脑和软件为例其示例代码如下:

 1 // BridgeModel.h文件
 2 #pragma once
 3 #include <iostream>
 4 
 5 class Software
 6 {
 7 public:
 8     virtual void run() = 0;
 9 };
10 
11 class SoftwareGame : public Software
12 {
13 public:
14     void run()
15     {
16         std::cout << "游戏软件" << std::endl;
17     }
18 };
19 
20 class SoftwareNote : public Software
21 {
22 public:
23     void run()
24     {
25         std::cout << "记事本软件" << std::endl;
26     }
27 };
28 //
29 class Computer
30 {
31 protected:
32     Software * m_software;
33 public:
34     Computer() : m_software(nullptr){}
35     virtual ~Computer()
36     {
37         if (nullptr == m_software)
38             delete m_software;
39     }
40     virtual void run() = 0;
41     void setSoftware(Software *p)
42     {
43         m_software = p;
44     }
45 };
46 
47 class ComputerLenovo : public Computer
48 {
49 public:
50     void run()
51     {
52         std::cout << "联想的电脑运行";
53         m_software->run();
54     }
55 };
56 
57 class ComputerMirco : public Computer
58 {
59 public:
60     void run()
61     {
62         std::cout << "微软的电脑运行";
63         m_software->run();
64     }
65 };

测试代码如下:

 1 #include <iostream>
 2 #include "BridgeModel.h"
 3 
 4 int main()
 5 {
 6     using namespace std;
 7     // 桥接模式
 8     Computer *p = new ComputerLenovo();
 9     p->setSoftware(new SoftwareGame());
10     p->run();
11     delete p;
12     
13     p = new ComputerMirco();
14     p->setSoftware(new SoftwareNote());
15     p->run();
16     delete p;
17 
18     getchar();
19     return 0;
20 }

测试结果如下图:

标签:run,桥接,电脑,C++,实现,软件,设计模式,public
From: https://www.cnblogs.com/ybqjymy/p/17534738.html

相关文章

  • C/C++订餐管理系统[2023-07-07]
    C/C++订餐管理系统[2023-07-07]1、订餐管理系统要求实现饭店的订餐信息管理,包括菜单管理、订单管理、统计分析。实现菜单信息(菜号、菜名、价格、成本)的增删改查;实现订单管理(订单号、就餐人数、下单时间、订单总价、订单包含的所有菜品(菜号、数量))。系统功能包括以下方面:A、菜......
  • 学习C++这一篇就够了(进阶篇)
    ​内存模型C++在执行程序的时候,将内存方向划分为4个区域:代码区:存放二进制代码,由操作系统进行管理全局区:存放全局变量、静态变量、常量,程序结束后由操作系统释放栈区:存放函数参数、局部变量,由编译器自动分配和释放堆区:由开发者申请分配和释放,若程序员不释放,程序结束由......
  • C++ 中的函数重载
     在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。https://www.121mu.com/bkjq211/......
  • C++ 多态
     多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。下面的实例中,基类Shape被派生为两个类https://www.121mu.com/czss/......
  • C++ 中的运算符重载
     您可以重定义或重载大部分C++内置的运算符。这样,您就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数,函数名是由关键字operator和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。https://www.micsoon.com/bkzn19/......
  • C++ std::chrono 计时器的使用
    使用标准库 #include<chrono>intmain(){ autostampBeg=std::chrono::steady_clock::now(); //dosometing Sleep(2400); autostampEnd=std::chrono::steady_clock::now(); doubletime_second=std::chrono::duration<double>(stampEnd-sta......
  • C++银行存取款管理系统[2023-07-06]
    C++银行存取款管理系统[2023-07-06]银行存取款管理系统一、 功能描述能够输入和查询客户存款取款记录。在客户文件中,每个客户是一条记录,包括编号、客户姓名、支取密码、客户地址、客户、账户总金额;在存取款文件中,每次存取款是一条记录,包括编号、日期、类别、存取数目、经办人。......
  • C/C++基于哈夫曼树的文件压缩软件[2023-07-06]
    C/C++基于哈夫曼树的文件压缩软件[2023-07-06]案例2基于哈夫曼树的文件压缩软件2.1简介数据压缩分为两大类:无损压缩和有损压缩。无损压缩是指压缩后还能还原回原来的数据的压缩方法,有损压缩一般是针对图像、视频或音频进行的压缩,在压缩后图像、视频或音频的质量会有所下降......
  • 《Effective C++ 改善程序与设计的55个具体做法》读书笔记
    1.让自己习惯C++条款01视C++为一个语言联邦CObject-OrientedC++TemplateC++STLC++高效编程守则视情况而变化,取决于你使用C++的哪一部分。条款02尽量与const,enum,inline替换#define对于单纯常量,最好以const对象或enums替换#defines。对于形似函数的宏(macros),最好改......
  • C++11:总结
     autodecltypeRvaluereferencesandmovesemanticsLambdaexpressionsnullptrstatic_assertRangebasedforloopTrailingreturntypeinfunctionsfinalmethodkeywordoverridemethodkeywordStronglytypedenumsForwarddeclaredenumsexterntemplates......