C++设计模式-- 2.代理模式 和 外观模式

文章目录

  • 代理模式
  • 外观模式
    • 角色和职责
    • 代码演示一:
    • 代码演示二:
    • 外观模式适用场景

代理模式

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合 或不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式有以下三种角色:
Subject(抽象主题角色):真实主题与代理主题的共同接口。
RealSubject(真实主题角色):定义了代理角色所代表的真实对象。
Proxy(代理主题角色):含有对真实主题角色的引用,代理角色通常在将客户端调用传递给真实主题对象之前或者之后执行某些操作,而不是单纯返回真实的对象。

代码演示:

//抽象主题角色
//抽象的公共接口
class AbstractCommonInterface
{
public:virtual void run() = 0;virtual ~AbstractCommonInterface() {};
};
//真实主题角色
//真实的系统
class MySystem :public AbstractCommonInterface
{
public:void run() override{cout << "系统启动....." << endl;}
};
在这里插入代码片
//代理主题角色
//必须要有权限验证,不是所有人都能来启动我的系统,提供用户名和密码
class MySystemProxy :public AbstractCommonInterface
{
public:MySystemProxy(string mUserName, string mPassword) : mySystem(new MySystem){this->mUserName = mUserName;this->mPassword = mPassword;};~MySystemProxy(){ if (mySystem != nullptr) {delete mySystem;}	};bool checkUserNameAndPassword() {if (mUserName == "admin" && mPassword == "123"){return true;}else {return false;}}void run() override{if (checkUserNameAndPassword()){this->mySystem->run();//调真实的服务系统}else {cout << "accout or password is error!" << endl;}}
private:MySystem* mySystem;//真实系统的指针string mUserName; //账号string mPassword; //密码
};

测试调用:

int main(int argc, char* argv[])
{AbstractCommonInterface* mySystemProxy = new MySystemProxy("admin","123");mySystemProxy->run();delete mySystemProxy;return 0;
}

输出结果:
在这里插入图片描述
代理模式类的UML图如下:
在这里插入图片描述

外观模式

根据迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。
Facade模式也叫外观模式,是由GoF提供的23种设计模式中的一种。
Facade模式为一组有类似功能的类群,比如类库,子系统等待,提供一个一致的简单界面。这个一致的简单界面被称作Facade。
外观模式就是将复杂的子类系统抽象到同一个接口进行管理,外界只需要通过此接口与子类系统进行交互,而不必要直接与复杂的子类系统进行交互

角色和职责

Facade(外观角色):为调用方,定义简单的调用接口。
SubSystem(子系统角色):功能提供者。指提供功能的类群(模块或子系统)。

代码演示一:

子系统代码

//子系统 1
class SubSystem1
{
public:void run() {cout << "子系统一运行..." << endl;}
};//子系统 2
class SubSystem2
{
public:void run() {cout << "子系统二运行..." << endl;}
};//子系统 3
class SubSystem3
{
public:void run() {cout << "子系统三运行..." << endl;}
};//子系统 4
class SubSystem4
{
public:void run() {cout << "子系统四运行..." << endl;}
};

外观类代码

class Facade
{
public:Facade() {pSystem1 = new SubSystem1;pSystem2 = new SubSystem2;pSystem3 = new SubSystem3;pSystem4 = new SubSystem4;}~Facade() {delete pSystem1;delete pSystem2;delete pSystem3;delete pSystem4;}void runSystem(){pSystem1->run();pSystem2->run();pSystem3->run();pSystem4->run();}private:SubSystem1* pSystem1;SubSystem2* pSystem2;SubSystem3* pSystem3;SubSystem4* pSystem4;
};

注意:因为Facade类的成员变量SubSystem1/2/3/4类型的指针,而不是SubSystem1类型的实例是其成员变量,
所以这里Facade类和SubSystem1/2/3/4都不能称为关联。又因为Facade类的构造函数中,用到了SubSystem1/2/3/4类。
所以Facade类依赖于SubSystem1/2/3/4类。Facade类和SubSystem1/2/3/4类是依赖关系。
拓展:关联是“HAS”关系,依赖是“USE”关系 。A类关联B类,指的是B类对象作为A类的属性存在,称为“has”关系。
A类依赖B类,指的是B的对象作为A类的方法参数或者在A类的方法内 存在,称为“use”关系 。
测试调用代码

void test(){Facade* facade = new Facade;facade->runSystem();
}int main(int argc, char *argv[])
{test()return 0;
}

针对上例的外观模式UML类图:
在这里插入图片描述

代码演示二:

根据类图,实现家庭影院外观模式
实现KTV模式:
开启时:电视打开,灯关掉,音响打开,麦克风打开,dvd打开。
关闭时:电视关掉,灯打开,音响关掉,麦克风关掉,dvd关掉。
实现游戏模式:
开启时:电视打开,音响打开,游戏机打开。
关闭时:电视关掉,音响关掉,游戏机关掉。

子系统角色:

//电视机
class Television
{
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 KTVMode
{
public:KTVMode(){pTv = new Television;	pLight = new Light;	pAudio = new Audio;	pMicrophone = new Microphone;	pDvd = new DVDPlayer;	}~KTVMode(){delete pTv;	delete pLight;	delete pAudio;	delete pMicrophone;	delete pDvd;	}void OnKTV(){pTv->On();pLight->Off();pAudio->On();pMicrophone->On();pDvd->On();}void OffKTV(){pTv->Off();pLight->On();pAudio->Off();pMicrophone->Off();pDvd->Off();}private:Television* pTv;Light* pLight;Audio* pAudio;Microphone* pMicrophone;DVDPlayer* pDvd;
};//游戏模式
class GameMode
{
public:GameMode(){pTv = new Television;	pAudio = new Audio;	pGamemachine = new Gamemachine;	}~GameMode(){delete pTv;	delete pAudio;	delete pGamemachine;		}void OnGame(){pTv->On();pAudio->On();pGamemachine->On();}void OffGame(){pTv->Off();pAudio->Off();pGamemachine->Off();}private:Television* pTv;Audio* pAudio;Gamemachine* pGamemachine;
};

测试调用:

//测试KTV模式
void testKTVMode()
{KTVMode* pKTVMode = new KTVMode;pKTVMode->OnKTV();//开启KTV模式//pKTVMode->OffKTV();//关闭KTV模式
}//测试游戏模式
void testGameMode()
{GameMode* pGameMode = new GameMode;pGameMode->OnGame();//开启游戏模式//pGameMode->OffGame();//关闭游戏模式
}int main(int argc, char *argv[])
{testKTVMode();//testGameMode();return 0;
}

针对上例的外观模式UML类图:
在这里插入图片描述

外观模式适用场景

1.复杂系统需要简单入口使用。
2.客户端程序与多个子系统之间存在很大的依赖性。
3.在层次化结构中,可以使用外观模式定义系统中每一层的入口,
层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

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

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

相关文章

git推送前HOOK pre-push判断版本号增加再推送

我写了一个C程序&#xff0c;然后每次编译后&#xff0c;记不得当时的版本是哪个源代码&#xff0c;对于core dump复现调试很麻烦。 为此我想了一个办法&#xff0c;首先在include/git_version.hpp 创建一个版本的文件 /** Description:* Author: jiangsheng* Date: 2024-01-…

数据结构与算法:快速排序

数据结构与算法&#xff1a;快速排序 快速排序荷兰国旗问题霍尔版本递归优化小区间优化 PartSort优化三数取中 挖坑法前后指针法 非递归法 快速排序 荷兰国旗问题 想要理解快速排序&#xff0c;就先理解这个问题&#xff1a; [LeetCode75.颜色分类] 荷兰国旗是由红白蓝三色组…

10.云原生之在线开发调试

云原生专栏大纲 文章目录 vscode-server介绍VSCode Server 和云开发结合vscode-server安装code-server安装插件在线安装插件离线安装插件安装中文插件 配置开发环境在容器中安装开放环境Dockerfile制作镜像 git拉取项目 vscode-server介绍 VSCode Server&#xff08;Visual S…

动态内存面试的经典题目

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

js includes方法的使用

JavaScript中的数组includes()方法用于判断数组中是否包含指定的元素&#xff0c;并返回一个布尔值。 includes()方法的语法如下&#xff1a; array.includes(searchElement[, fromIndex]) 其中&#xff0c;array是要进行搜索的数组&#xff0c;searchElement是要搜索的元素…

网络安全中的“三高一弱”和“两高一弱”是什么?

大家在一些网络安全检查中&#xff0c;可能经常会遇到“三高一弱”这个说法。那么&#xff0c;三高一弱指的是什么呢&#xff1f; 三高&#xff1a;高危漏洞、高危端口、高风险外连 一弱&#xff1a;弱口令 一共是4个网络安全风险&#xff0c;其中的“高危漏洞、高危端口、弱…

电脑怎么录制屏幕?看这一篇就够了

在数字时代&#xff0c;电脑屏幕录制已经成为人们日常生活中一个越来越重要的工具。无论是录制在线课程、游戏精彩时刻&#xff0c;还是远程会议、软件演示&#xff0c;屏幕录制都可以帮助我们更好地保存和分享这些信息。可是您知道电脑怎么录制屏幕吗&#xff1f;本文将介绍两…

GATHER_DATABASE_STATS 的常见问题及 权限 ANALYZE ANY

​​​​​​光有执行DBMS_STATS的权限还是不够的 DBMS_STATS.GATHER_DATABASE_STATS (ESTIMATE_PERCENT > 30); * ERROR at line 1: ORA-20000: Insufficient privileges to analyze an object in Database ORA-06512: at "SYS.DBMS_STATS", line 13323 ORA-0651…

旧电脑追加内存条

内存条基本知识 DDR4 2666 DDR&#xff08;Double Data Rate&#xff09;双倍速率 4 第四代 2666 内存主频2666MHz 内存时序 内存的延迟时间 传输带宽 MB/s 内存和CPU之间的传输速度 针脚数 数字-PIn 288-PIN就是288个针脚 选购内存条 …

【国产mcu填坑篇】华大单片机(小华半导体)一、SPI的DMA应用(发送主机)HC32L136

最近需要用华大的hc32l136的硬件SPIDMA传输&#xff0c;瞎写很久没调好&#xff0c;看参考手册&#xff0c;瞎碰一天搞通了。。。 先说下我之前犯的错误&#xff0c;也是最宝贵的经验&#xff0c;供参考 没多看参考手册直接写&#xff08;即使有点烂仍然提供了最高的参考价值。…

iis配置asp网站

1.安装IIS的ASP win7和win10都是一样的 下安装IIS时ASP一般被默认不选中的状态&#xff0c;因此需要打开IIS检查功能视图栏中是否存在ASP选项&#xff0c;若没有则需要从控制面板->程序和 功能->打开或关闭Windows功能->Internet信息服务->万维网服务->应用程序…

数环通更新动态|新增连接器抖店自建、叮当OKR、千易ERP、货拉拉

更新快速预览 新增连接器4个 抖店自建 叮当OKR 千易ERP 货拉拉 应用更新2个 百度统计&#xff08;2&#xff09; 旺店通&#xff08;1&#xff09; 应用连接器 新增连接器 1.抖店自建 抖店是抖音官方打造的电商商家实现一站式经营平台&#xff0c;为商家提供全链路服务&#xf…

Selenium定位元素的方法css和xpath的区别

selenium是一种自动化测试工具&#xff0c;它可以通过不同的定位方式来识别网页上的元素&#xff0c;如id、name、class、tag、link text、partial link text、css和xpath。 css和xpath是两种常用的定位方式&#xff0c;它们都可以通过元素的属性或者层级关系来定位元素&#…

MacOS环境下Kali Linux安装及使用指导

Kali Linux是一个开源的、基于Debian的Linux发行版&#xff0c;面向各种信息安全任务&#xff0c;如渗透测试、安全研究、计算机取证和逆向工程&#xff0c;是最先进的渗透测试发行版&#xff0c;它的前身是BackTrack。 1. 我们为什么要用Kali Linux 由于Kali Linux具有以下特…

【脑筋急转弯系列】乒乓球称重问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

SpringBoot+Vue实现一个系统登录功能

1. 创建一个Spring Boot项目&#xff0c;添加Web和Security依赖。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>2. 创建一个User实体类&#xff0c;用…

vue render函数的使用场景

render函数使用和详解_render函数如何使用-CSDN博客 上面链接写的很详细&#xff0c;有不懂的地方可以留言互相交流哈&#xff01;~~~~~~

蓝桥杯简介

蓝桥杯全国软件和信息技术专业人才大赛是由工业和信息化部人才交流中心举办的全国性IT学科赛事。这个比赛在全国范围内有着广泛的影响力&#xff0c;参赛人数已经累计超过40万人&#xff0c;涵盖了全国1200余所高校。在高校教育教学改革和创新人才培养方面&#xff0c;蓝桥杯大…

FDTD2018a安装问题记录

FDTD2018a安装问题记录 目录问题解决方案 目录 问题 解决方案 电脑名字如果是中文改成英文

编程笔记 html5cssjs 036 CSS概述

编程笔记 html5&css&js 036 CSS概述 一、什么是 CSS?二、样式非常重要三、CSS 语法四、CSS 注释五、示例 CSS (Cascading Style Sheets&#xff0c;层叠样式表&#xff09;&#xff0c;是一种用来为结构化文档&#xff08;如 HTML 文档或 XML 应用&#xff09;添加样式…