首页 > 编程语言 >设计模式(十八)桥接模式 C++

设计模式(十八)桥接模式 C++

时间:2022-11-07 19:32:35浏览次数:57  
标签:run 角色 桥接 void C++ 实现 设计模式 public


桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。

桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。

桥接模式号称是最难理解的模式,其实不然。“将抽象部分与它的实现部分分离”,意思是说实现系统可能会有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少之间的耦合。比如运行手机软件,手机有手机的分类,软件有软件的分类,那么就可以把手机和软件分离出来,让他们独立变化。

// 不要理解成抽象类和实现类分离

桥接模式涉及到了​合成/聚合复用原则​

合成/聚合复用原则是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的

 模式的结构

桥接(Bridge)模式包含以下主要角色。

  1. 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
  2. 扩展抽象化(Refined    Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  3. 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
  4. 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。

以手机软件为例

手机品牌 (HandsetBrand) 是抽象化(Abstraction)角色 

华为 (HandsetBrandHuaWei)和苹果(HandsetBrandiPhnoe)是拓展抽象化(Refined    Abstraction)角色

手机软件抽象类 (HandsetSoft)是实现化角色(Implementor)

游戏(HandsetGame)和通信录( HandsetAddressList)是具体实现化(Concrete Implementor)角色

然后抽象角色里面保存了实现化角色的指针,通过指针来进行多态的调用实现化角色。

设计模式(十八)桥接模式 C++_复用

下面是代码示范

#include <iostream>  
#include <string>
using namespace std;

class HandsetSoft //手机软件
{
public:
virtual void run() = 0;
};

class HandsetGame :public HandsetSoft //游戏软件
{
public:
void run()
{
cout << "运行手机游戏" << endl;
}
};

class HandsetAddressList :public HandsetSoft //通讯录软件
{
public:
void run()
{
cout << "运行手机通讯录" << endl;
}
};

class HandsetBrand //手机品牌
{
protected:
HandsetSoft *soft;
public:
void setHandsetSoft(HandsetSoft *soft)
{
this->soft = soft;
}
virtual void run() = 0;
};

class HandsetBrandHuaWei :public HandsetBrand //N品牌
{
public:
void run()
{
soft->run();
}
};

class HandsetBrandiPhnoe :public HandsetBrand //M品牌
{
public:
void run()
{
soft->run();
}
};

int main()
{
HandsetBrand *pPhone;
pPhone = new HandsetBrandHuaWei();

pPhone->setHandsetSoft(new HandsetGame());
pPhone->run();
pPhone->setHandsetSoft(new HandsetAddressList());
pPhone->run();

cin.get();
return 0;
}

关于合成聚用原则

一:合成/聚合复用原则

  尽量使用合成/聚合,尽量不要使用类继承

  二:什么是合成?

  合成表示一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样,打个比方:人有两个胳膊,胳膊和人就是部分和整体的关系,人去世了,那么胳膊也就没用了,也就是说胳膊和人的生命周期是相同的

  . 合成关系用实心的菱形+实线来表示

  三:什么是聚合?

  . 聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但是B对象并不是A对象的一部分,打个比方:人是群居动物,所以每个人属于一个人群,一个人群可以有多个人,所以人群和人是聚合的关系

  聚合关系用空心的菱形+实线来表示

  四:为什么尽量不要使用类继承而使用合成/聚合?

  . 对象的继承关系在编译时就定义好了,所以无法在运行时改变从父类继承的子类的实现

  . 子类的实现和它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化

  . 当你复用子类的时候,如果继承下来的实现不适合解决新的问题,则父类必须重写或者被其它更适合的类所替换

  这种依赖关系限制了灵活性,并最终限制了复用性

标签:run,角色,桥接,void,C++,实现,设计模式,public
From: https://blog.51cto.com/u_11320078/5831084

相关文章

  • visual c++6.0对浮点数处理器的初始化
       <C++反汇编与逆向分析>的作者在书中P21页列写了一段代码:intmain(){intnInt0;scanf("%f",&nInt);}并简短的提到,运行上面这段程序并输入小数,将会导致程序崩......
  • JAVA 责任链设计模式
    这次介绍责任链模式,采用最普遍的请假例子来编码实现。先给列出个模拟的需求,一个人请假,调用一个接口,传入的参数是他请假的天数。然后,请假的天数---->如果小于2天,由直属领导......
  • C++ 悬垂指针
    /***********************************************************************//一、迷途指针(悬垂指针)在计算机编程领域中,迷途指针与野指针指的是不指向任何合法的对象的......
  • C++入门知识点
        今天我为大家带来的是有关C++入门知识点,总共分为5个小知识点,分别是:命名空间,缺省参数,函数重载,引用和auto关键字(C++11)。在这其中,我们还会穿插将一些知识点,希望大......
  • 创建型设计模式-原型模式(深拷贝,浅拷贝)
    Person类:publicclassPerson{publicstringName{get;set;}publicintAge{get;set;}publicAddressAddress{get;set;......
  • C/C++算法从菜鸟到达人
    "IT有得聊”是机械工业出版社旗下IT专业资讯和服务平台,致力于帮助读者在广义的IT领域里,掌握更专业、实用的知识与技能,快速提升职场竞争力。今天为您推荐一本精品图书--C/C++......
  • 创建型设计模式-单例模式(为什么要双重加锁判断)
    代码publicclassSingleObject{privatestaticSingleObjectinstance;privatestaticobjectlockobj=newobject();privateSingleObject(){}publicstatic......
  • 设计模式学习(二):单例模式
    设计模式学习(二):单例模式作者:Grey原文地址:博客园:设计模式学习(二):单例模式CSDN:设计模式学习(二):单例模式单例模式单例模式是创建型模式。单例的定义:“一个类只允许创建......
  • 〖JAVA养成计划〗设计模式-单例设计模式以及衍生的多例设计模式
     单例设计模式packagecom.tongbu;/***单例设计模式分为两类:*①是俄汉式*②是懒汉式*以下程序是俄汉式:不管程序中有没有使用,都实例化对象。*@authorAdministrat......
  • 「经验」上海电信获取公网IP 光猫改桥接 支持IPTV 是否降速
    「经验」上海电信获取公网IP光猫改桥接支持IPTV是否降速2022/05/084:04PM 作者:aRAY 分类:[折腾]NAS/软路由/智能家居 9.93K ▼近期折腾了一下宽带,关于上海电......