目录

一、代理模式

二、装饰模式

三、外观模式

四、适配器模式


一、代理模式

通过一个代理类,来控制对这个对象的访问。

类别 描述
适用场景
  • 为其他对象提供一种代理以控制对这个对象的访问
优点
  • 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度
缺点
  • 代理实现较为复杂

无代理模式,人人可具备权限

#include <iostream>
using namespace std;//提供一种代理来控制对其他对象的访问class AbstraactCommonInterface {
public:virtual void run() = 0;};//我已经写好的系统
class Mysystem {
public:virtual void run() {cout << "系统启动..." << endl;}
};//必须有权限验证,不是所有人都能来启动我的启动,必须提供用户名和密码int main() {//这样不行。是个人都能启动Mysystem* system = new Mysystem;system -> run();return 0;
}

增加代理模式

#include <iostream>
using namespace std;//提供一种代理来控制对其他对象的访问
class AbstraactCommonInterface {
public:virtual void run() = 0;};//我已经写好的系统
class Mysystem :public AbstraactCommonInterface{
public:virtual void run() {cout << "系统启动..." << endl;}
};//必须有权限验证,不是所有人都能来启动我的启动,必须提供用户名和密码
class MysystemProxy :public AbstraactCommonInterface {
public:MysystemProxy(string username,string password) {this->mUsername = username;this->mPassword = mPassword;}bool checkUsernameAndPassword() {if (mUsername == "admin"&&mPassword == "admin") {return true;}return false;}virtual void run() {if (checkUsernameAndPassword()) {cout << "用户名和密码正确,验证通过..." << endl;this->pSystem->run();}else {cout << "用户名或密码错误,权限不足...." << endl;}}~MysystemProxy() {if (pSystem != NULL) {delete pSystem;}}
public:Mysystem* pSystem;string mUsername;string mPassword;
};int main() {
#if 0//这样不行。是个人都能启动Mysystem* system = new Mysystem;system -> run();
#endif//调用代理模式MysystemProxy* proxy = new MysystemProxy("root","admin");proxy->run();return 0;
}

二、装饰模式

通过一种对客户端透明的方式,扩展对象功能

具体操作是,功能放到单独的类中,客户端可以选择、排序等装饰对象。

类别 描述
适用场景
  • 动态、透明的方式给单个对象添加职责
  • 当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式
优点
  • 装饰模式比继承更加灵活性,不会导致类的个数急剧增加
  • 通过一种动态的方式来扩展一个对象的功能,从而实现不同的行为
  • 可以对一个对象进行多次装饰
缺点
  • 装饰模式进行系统设计时将产生很多小对象,大量小对象的产生势必会占用更多的系统资源,影响程序的性能
#include <iostream>
using namespace std;//一般情况下,用继承实现类的功能拓展
//装饰模式 可以动态给一个类增加功能//抽象英雄
class AbstractHero {
public:virtual void ShowStatus() = 0;
public:int mHp;int mMp;int mAt;int mDf;
};//具体英雄
class HeroA :public AbstractHero {
public:HeroA() {mHp = 0;mMp = 0;mAt = 0;mDf = 0;}virtual void ShowStatus() {cout << "血量:" << mHp << endl;cout << "魔法:" << mMp << endl;cout << "攻击:" << mAt << endl;cout << "防御:" << mDf << endl;}
};//英雄穿上某个装饰物 那么他还是个英雄
//装饰物
class AbstractEquipmet : public AbstractHero {
public:AbstractEquipmet(AbstractHero* hero) {this->pHero = hero;}virtual void ShowStatus() = 0;
public:AbstractHero* pHero;};//狂徒
class KuangtuEquipment :public AbstractEquipmet {
public:KuangtuEquipment(AbstractHero* hero) :AbstractEquipmet(hero) {}//增加额外的功能void AddKuangtu() {cout << "英雄穿上狂徒之后..." << endl;this->mHp = this->pHero->mHp;this->mMp = this->pHero->mMp;this->mAt = this->pHero->mAt;this->mDf = this->pHero->mDf + 30;delete this->pHero;}virtual void ShowStatus() {AddKuangtu();cout << "血量:" << mHp << endl;cout << "魔法:" << mMp << endl;cout << "攻击:" << mAt << endl;cout << "防御:" << mDf << endl;}
};//无尽
class Wujing : public AbstractEquipmet {
public:Wujing(AbstractHero* hero) :AbstractEquipmet(hero) {}//增加额外的功能void AddWujing() {cout << "英雄穿上无尽之后..." << endl;this->mHp = this->pHero->mHp;this->mMp = this->pHero->mMp;this->mAt = this->pHero->mAt + 80;this->mDf = this->pHero->mDf;delete this->pHero;}virtual void ShowStatus() {AddWujing();cout << "血量:" << mHp << endl;cout << "魔法:" << mMp << endl;cout << "攻击:" << mAt << endl;cout << "防御:" << mDf << endl;}
};int main() {AbstractHero* hero = new HeroA;hero->ShowStatus();cout << "----------------------------" << endl;//给裸奔的英雄穿上衣服后hero = new KuangtuEquipment(hero);hero->ShowStatus();cout << "----------------------------" << endl;//装备武器hero = new Wujing(hero);hero->ShowStatus();return 0;
}

三、外观模式

两个子系统,如果都初始化,传统需要一个一个new一下,现在提供一个类,在这个类里面做完初始化工作。

外观模式就是将复杂的子类系统抽象到同一个的接口进行管理,外界只需要通过此接口与子类系统进行交互,而不必要直接与复杂的子类系统进行交互

类别 描述
适用场景
  • 复杂系统需要简单入口使用
  • 客户端程序与多个子系统之间存在很大的依赖性
  • 可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度
优点
  • 屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易
  • 子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可
  • 子系统的修改对其他子系统没有任何影响
缺点
  • 对客户端访问子系统类做太多的限制则减少了可变性和灵活性
  • 设计不当,增加新的子系统可能需要修改外观类的源代码
#include <bits/stdc++.h>
using namespace std;//电视机
class Televison {
public:void On() {cout << "电视机打开..." << endl;}void Off() {cout << "电视机关闭" << endl;}
};
//灯
class Light {
public:void On() {cout << "灯打开..." << endl;}void Off() {cout << "灯关闭" << endl;}
};
//音箱
class Audio {
public:void On() {cout << "音箱打开..." << endl;}void Off() {cout << "音箱关闭" << endl;}
};
//麦克风
class Microphone {
public:void On() {cout << "麦克风打开..." << endl;}void Off() {cout << "麦克风关闭" << endl;}
};
//DVD
class DVDPlayer {
public:void On() {cout << "DVD播放器打开..." << endl;}void Off() {cout << "DVD播放器关闭" << endl;}
};
//游戏机
class Gamemachine {
public:void On() {cout << "游戏机打开..." << endl;}void Off() {cout << "游戏机关闭" << endl;}
};//KTV模式
class KTVModel {
public:KTVModel() {pTv = new Televison;pLight = new Light;pAudio = new Audio;pMicrophone = new Microphone;pDVD = new DVDPlayer;}void OnKtv() {pTv->On();pLight->Off();pAudio->On();pMicrophone->On();pDVD->On();}void OffKtv() {pTv->Off();pLight->On();pAudio->Off();pMicrophone->Off();pDVD->Off();}~KTVModel() {delete pTv;delete pLight;delete pAudio;delete pMicrophone;delete pDVD;}public:Televison* pTv;Light* pLight;Audio* pAudio;Microphone* pMicrophone;DVDPlayer* pDVD;
};int main() {KTVModel* ktv = new KTVModel;ktv->OnKtv();return 0;
}

四、适配器模式

使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

类别 描述
适用场景
  • 现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码
  • 创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作
优点
  • 目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构
  • 客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用
  • 可以在不修改原有代码的基础上增加新的适配器类
缺点
  • 适配器中置换适配者类的某些方法比较麻烦
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;//适配器模式 就是将已经写好的接口,但是这个接口不符合需求
//将写好的接口转换成目标接口//这函数我已经写好
struct Myprint{void operator()(int v1,int v2) {cout << v1 + v2 << endl;}
};//定义目标接口 我要是配偶 适配成什么样的,
//要适配成只能传一个参数的,适配for_each第三个参数的适用
class Target {
public:virtual void operator()(int v) = 0;};//写适配器
class Adapater :public Target {
public:Adapater(int param) {this->param = param;}virtual void operator() (int v) {print(v,param);}
public:Myprint print;int param;
};//MyBind2nd,原来param固定的10,现在提供一个方法改
Adapater MyBind2nd(int v) {return Adapater(v);
}int main(void) {vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}//适配器模式的运用//for_each()的第三个参数是个带一个参数的函数,但是Myprint需要两个参数for_each(v.begin(),v.end(), MyBind2nd(10));return 0;
}

[架构设计] 结构型模型相关推荐

  1. 4.C++设计模式-结构型模型

    4.C++设计模式-结构型模型 让类和类进行组合,获得更大的结构. 4.1 代理模式 4.1.1 代理模式的理论 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不 ...

  2. 设计模式之结构型模型

    设计模式之结构型模型 桥接模式 尽可能不要使用类的继承,而尽可能使用 合成/聚合 描述: 继承方法子类与父类的高依赖性限制了复用和程序的灵活性. 选择不同的接口实现选择不同的业务类型 import o ...

  3. php 长连接心跳_支持gRPC长链接,深度解读Nacos2.0架构设计及新模型

    作者 | 杨翊(席翁) Nacos PMC 来源|阿里巴巴云原生公众号 Nacos 简介 Nacos 在阿里巴巴起源于 2008 年五彩石项目,该项目完成了微服务拆分和业务中台建设,随着云计算和开源环 ...

  4. 支持 gRPC 长链接,深度解读 Nacos 2.0 架构设计及新模型

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者 | 杨翊(席翁)  Nacos PMC Nacos ...

  5. 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第1节 ①...

    2019独角兽企业重金招聘Python工程师标准>>> 一.MapReduce已死,Spark称霸 由于Hadoop的MapReduce高延迟的死穴,导致Hadoop无力处理很多对时 ...

  6. [架构设计] 创建型模型

    目录 一.简单工厂模式 二.工厂模式 三.抽象工厂模式 四.单例模式 一.简单工厂模式 类别 描述 适用场景 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂 客户 ...

  7. 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第2节②...

    2019独角兽企业重金招聘Python工程师标准>>> 三, Spark的RDD 在Spark中一切都是以RDD为基础和核心的: 每个RDD的API如下所示: Spark官方文档中给 ...

  8. Netty高并发高性能架构设计NIO空轮训BUG

    Netty高并发高性能架构设计&NIO空轮训BUG Netty高并发高性能架构设计 Netty线程模型 Netty主从Reactor模型设计的精髓 无锁串行化设计思想 零拷贝 直接内存 Net ...

  9. 七大设计原则与设计模式(创建型模式、结构型模式、行为型模式)

    七大设计原则 开闭原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则(最少知道原则).里氏替换原则.合成 (组合).聚合复用原则 开闭原则 定义: 一个软件实体如类.模块和函数应该对扩展开放, ...

最新文章

  1. pyhton 中的字符串切片问题
  2. 【POJ1456】Supermarket
  3. JAVA判断输入的是数字、字符还是汉字
  4. aac fhg lc哪一个模式_旅游没电别发愁,一个充电头,助你游遍全球
  5. 【python】时间处理函数以及文件操作
  6. aix系统输入oracle命令,aix 简单的系统命令
  7. ROS入门-16.tf坐标系广播与监听的编程实现
  8. Android开发笔记(八十二)SDK版本兼容
  9. 使用kafka消息队列中间件实现跨进程,跨服务器的高并发消息通讯
  10. Nopi的学习笔记(C#篇)
  11. MATLAB手写数字识别
  12. 抖音短视频实操:抖音热门视频的分类特点,如何选择视频内容(上)
  13. android格式化通讯录
  14. 三国演义人名爬取与处理
  15. mysql拼图游戏代码_HTML+Javascript制作拼图小游戏详解(二)
  16. Android App开发实战之实现微信记账本(附源码 超详细必看)
  17. XDOC 在线word文档表格预览
  18. #2 – Rendering Tiers(WPF渲染级别)
  19. groupby后选取列和不选取列的区别
  20. 《前端》localStorage 和 sessionStorage-将数据存入(取出)缓存的方法-2020年10月6日

热门文章

  1. xunsearch安装配置
  2. u盘安装盘的制作汇总
  3. java 继承、super、this、抽象类
  4. 数据争用(data race) 和竞态条件(race condition)
  5. Tekla钢结构二次开发 第5节正交梁、螺旋梁以及工作平面
  6. 基于eBox旋转编码器
  7. 第一章 Adobe After Effects AE插件开发 SDK入门-AE内部结构定义(一)-版本
  8. 广州市天河区2021-2022学年八年级第一学期期末考试英语试题
  9. 依赖注入的正确打开方式 bilibili/kratos × google/wire
  10. [PMP]作业题(一)模拟题错题整理