常见的结构型设计模式

设计模式(二)

常见的结构型模式

1.代理模式: 提供一种代理方法 ,来控制对其他对象的访问。在有些情况下,一个对象不能或者不适合直接访问另一个对象,而代理对象可以在这两个类之间起一个中介的作用。
在这里插入图片描述

举例:我们要启动一个系统 , 但是并不是所有的人都有权限来启动系统 ,所以我们需要一个代理方法来管理。

#include <iostream>
#include <string>
/*提供一种代理方法来控制对其他对象的访问
*/
class System {
public:virtual void run() = 0;virtual ~System() { }
};class MySystem :public System {
public:MySystem( ) {  }virtual ~MySystem() {  }virtual void run() {std::cout << "系统启动" << std::endl;}
};// 代理类 ( 系统启动需要验证用户名和密码 )
class myProxy:public System {
public:myProxy(std::string userName ,std::string userPassword):userName_( userName ),userPassword_( userPassword ) { my_system_ = new MySystem;}virtual ~myProxy( ) { if (my_system_) {delete my_system_;my_system_ = nullptr;}}virtual void run() {if (checkUserNameAndUserPassword()) {std::cout << "用户名和密码正确,正在启动系统......." << std::endl;my_system_ -> run();}else {std::cout << "用户名和密码错误,权限不足......." << std::endl;}}bool checkUserNameAndUserPassword() {if (userName_ == "R" && userPassword_ == "R") {return true;}return false;}private:MySystem* my_system_ ;std::string userName_;std::string userPassword_;
};int main() {// 我们的代理类myProxy* proxy = new myProxy("R", "R");// 通过代理类来启动系统proxy->run();system("pause");return 0;
}

2.外观模式: 将一些复杂的子系统全都抽象到同一个接口进行管理 , 外界只需要通过这个接口,就可以和子系统进行交互,而不需要直接和这些复杂的子系统进行交互。

案例:假设KTV有两种模式,游戏模式:开启wifi , 开启音响 。 灯光模式: 开启电视 , 开启灯光,开启麦克风。

具体实现

#include <iostream>class Wifi {
public:Wifi() {std::cout << "wifi开启" << std::endl;}~Wifi() { }
};class Sound {
public:Sound() { std::cout << "音响开启"<<std::endl;}~Sound() { }
};class Tv {
public:Tv() {std::cout << "电视开启" << std::endl;}~Tv() { }
};class Night {
public:Night() { std::cout << "开启灯光" << std::endl;}~Night() { }
};class Microphone {
public:Microphone() {std::cout << "开启麦克风" << std::endl;}~Microphone() { }
};class FacedPattern {
public:FacedPattern( ) {  }void openGamePattern() {wifi_ = new Wifi;sound_ = new Sound;}void openNightPattern() {microphone_ = new Microphone;night_ = new Night;tv_ = new Tv;}~FacedPattern() {if (wifi_) {delete wifi_;wifi_ = nullptr;}if (night_) {delete night_;night_ = nullptr;}if (tv_) {delete  tv_;tv_ = nullptr;}if (microphone_) {delete  microphone_;microphone_ = NULL;}if (sound_) {delete sound_;sound_ = nullptr;}}
private:Wifi* wifi_; Night *night_;Tv* tv_;Microphone* microphone_;Sound* sound_;
};int main() {FacedPattern facePattern;facePattern.openGamePattern();facePattern.openNightPattern();return 0;
}

3.适配器模式: 将已经写好得接口(但是这个接口是不符合需求de),转换成我们想要得目标接口。

#include <iostream>
#include <string>using namespace std;// 旧接口
class OldPriter {
public:OldPriter() { }void print(std::string text) {std::cout << "oldPriter: " << text << std::endl;}
};// 新接口
class NewPriter {
public:NewPriter() { }void print(std::string text) {std::cout << "newPriter: " << text << std::endl;}
};// 适配器接口
class Adapter:public OldPriter {
public:void print(std::string text) {newPriter.print(text);}
private:NewPriter newPriter;
};

4.装饰器模式: 动态的给一个类添加新的功能.

#include <iostream>using namespace std;/*一个英雄的属性 :  防御、攻击力装饰一个反甲 :   防御力 + 30装饰一把无尽之刃 : 攻击力 + 60
*/// 英雄的抽象类
class AbstractHero {
public:virtual ~AbstractHero() { }virtual void showHeroState() = 0;
public:int defense_ ;   // 防御int attack_ ;	// 工具
};// 具体的英雄--->石头人
class Malphite :public AbstractHero {
public:Malphite( ){// 没购买装备 ,攻击力和防御力都是60attack_ = 60;defense_ = 60;}virtual void showHeroState() {cout << "初始状态:" << endl;cout << "<防御力>" << defense_ << endl;cout << "<攻击力>" << attack_ << endl;}virtual ~Malphite() {  } 
};// 装饰器抽象类
class AbstractDecoratorPattern :public AbstractHero {
public:AbstractDecoratorPattern( AbstractHero* Hero ){this->Hero_ = Hero;}virtual ~AbstractDecoratorPattern( ) {  }virtual void showHeroState() { }
public:AbstractHero* Hero_;
};// 给石头人添加一个反甲(  Coelonychia--->反甲 )
class Coelonychia  : public AbstractDecoratorPattern {
public:Coelonychia( AbstractHero* Hero ): AbstractDecoratorPattern( Hero ){   }virtual ~Coelonychia() { delete this->Hero_; }virtual void showHeroState() {AddEquip();cout << "穿上反甲之后:" << endl;cout << "<防御力>" << this->defense_ << endl;cout << "<攻击力>" << this->attack_ << endl;}void AddEquip( ) {this->defense_  = this->Hero_->defense_ + 30;this->attack_ = this->Hero_->attack_;}
};// 给石头人添加一个无尽之刃(  wujinzhiren--->反甲 )
class WuJinZhiRen : public AbstractDecoratorPattern {
public:WuJinZhiRen(AbstractHero* Hero) : AbstractDecoratorPattern( Hero ) {  }virtual ~WuJinZhiRen() { delete this->Hero_;  }virtual void showHeroState() {AddEquip();cout << "购买无尽之刃后:" << endl;cout << "<防御力>" << this->defense_ << endl;cout << "<攻击力>" << this->attack_ << endl;}void AddEquip() {this->attack_ = this->Hero_->attack_ + 60;this->defense_ = this->Hero_->defense_;}
};void test() {AbstractHero* Hero = new Malphite;   // 一个石头人对象Hero->showHeroState();cout << "-----------" << endl;Hero = new Coelonychia(Hero);Hero->showHeroState();cout << "-----------" << endl;Hero = new WuJinZhiRen(Hero);Hero->showHeroState();	
}int main( ) {test();return 0;
}

效果:

在这里插入图片描述

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

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

相关文章

Docker容器基础知识,即linux日常运维命令

Docker 是一个流行的用 Go 语言开发的开源项目&#xff0c;基于Linux内核的cgroup、namespace及 AUFS 等技术&#xff0c;对进程进行封装隔离&#xff0c;由 Dotcloud 公司开发。Docker已成为容器行业的事实标准。 小陈发现一个有趣的事情&#xff0c;容器的英文是Container&am…

甘肃的千层烤馍:传统面点的魅力绽放

千层烤馍&#xff0c;作为甘肃美食文化的重要象征&#xff0c;以其独特的外形和丰富的口感&#xff0c;吸引着众多食客。它的外观犹如一件精美的艺术品&#xff0c;层层叠叠&#xff0c;金黄酥脆&#xff0c;散发着诱人的香气。 在甘肃平凉地区制作千层烤馍&#xff0c…

国内大模型/智能体盘点丨16家公司,13款大模型,19个智能体

在当今这个智能化风起云涌的时代&#xff0c;随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;Large Language Models&#xff09;作为推动行业变革的关键力量&#xff0c;正逐步渗透到社会经济的各个角落。 从科技创新的最前沿到日常生活应用的细微之处&#xff0c…

相交链表--力扣160

相交链表 题目思路C代码 题目 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 思路 求两个链表的相交结点&#xff0c;使用…

ATFX汇市:瑞士央行连续第二次降息,USDCHF猛涨

ATFX汇市&#xff1a;昨日15:30&#xff0c;瑞士央行公布利率决议结果&#xff0c;将政策利率下调0.25个百分点&#xff0c;至1.25%。瑞士央行在政策声明中提到&#xff1a;与上一季度相比&#xff0c;潜在的通胀压力再次下降&#xff1b;瑞士目前的通货膨胀主要是由国内服务价…

成都晨持绪:现在的抖音网店怎么做更快起店

在当今社交媒体的浪潮中&#xff0c;抖音已经成为一个不可忽视的电商平台。对于想要快速起步的抖音网店来说&#xff0c;掌握一些关键策略至关重要。 首要的是定位清晰。你的网店需要有一个鲜明的主题&#xff0c;这可以是某一特定领域的产品&#xff0c;如美妆、服饰或是手工艺…

【C语言】解决C语言报错:Use-After-Free

文章目录 简介什么是Use-After-FreeUse-After-Free的常见原因如何检测和调试Use-After-Free解决Use-After-Free的最佳实践详细实例解析示例1&#xff1a;释放内存后未将指针置为NULL示例2&#xff1a;多次释放同一指针示例3&#xff1a;全局或静态指针被释放后继续使用示例4&am…

力扣1793.好子数组的最大分数

力扣1793.好子数组的最大分数 对于每个数 求其左右两侧小于它高度的元素下标(单调栈) class Solution {public:int maximumScore(vector<int>& nums, int k) {int n nums.size();vector<int> left(n,-1);stack<int> st;for(int i0;i<n;i){while(!…

一文读懂过零检测电路的作用、电路原理图及应用

过零检测电路是一种常见的应用&#xff0c;其中运算放大器用作比较器。它通常用于跟踪正弦波形的变化&#xff0c;例如过零电压从正到负或从负到正。它还可以用作方波发生器。过零检测电路有许多应用&#xff0c;例如标记信号发生器、相位计和频率计。#过零检测电路#可以采用多…

我的python-web基础(Flask前后端不分类)

1.HTML HTML是超文本标记语言 &#xff08; 英文 &#xff1a; HyperText Markup Language &#xff0c; HTML &#xff09;&#xff0c;它不是编程语言&#xff0c;而是一种标记语言 HTML标记标签通常被称为HTML标签&#xff0c;它的特点如下&#xff1a; HTML标签是由尖括…

最火AI角色扮演流量已达谷歌搜索20%!每秒处理2万推理请求,Transformer作者公开优化秘诀

卡奥斯智能交互引擎是卡奥斯基于海尔近40年工业生产经验积累和卡奥斯7年工业互联网平台建设的最佳实践&#xff0c;基于大语言模型和RAG技术&#xff0c;集合海量工业领域生态资源方优质产品和知识服务&#xff0c;旨在通过智能搜索、连续交互&#xff0c;实时生成个性化的内容…

Qt制作程序启动界面类QSplashScreen实例测试详解

目录 一、QSplashScreen的概述 二、QSplashScreen静态图片加载 1、主程序实现 2、mainwindow.h实现 3、mainwindows.cpp实现 三、QSplashScreen动态图片加载 1、主程序实现 2、mainwindow.h实现 3、mainwindows.cpp实现 一、QSplashScreen的概述 QSplashScreen&#x…

揭秘Xinstall如何助力App推广,提升用户量与转化率双指标!

在移动互联网时代&#xff0c;App的推广与运营成为了每个开发者必须面对的重要课题。然而&#xff0c;推广效果的评估和优化往往令众多开发者头疼不已。今天&#xff0c;我们将为您揭秘一款能够解决这一痛点的利器——Xinstall&#xff0c;带您一起探讨它如何助力App推广&#…

ARM32开发--存储器介绍

知不足而奋进 望远山而前行 目录 文章目录 前言 存储器分类 RAM ROM EEPROM Flash 总结 前言 在现代计算机系统中&#xff0c;存储器扮演着至关重要的角色&#xff0c;不仅影响着数据的存取速度和稳定性&#xff0c;还直接关系到计算机系统的性能和应用场景的选择。存…

密码CTF(4)——e和phi不互素

参考 RSA中e和phi不互素 AMM算法 AMM算法简要理解 RSA系列解题研究——e与phi不互素 - 先知社区 (aliyun.com) e与phi不互素 --- 四 1 1 1道题详记-CSDN博客 总述 gcd(e,φ(n))比较小时可以考虑iroot直接开根&#xff0c;当直接开根跑不出来时&#xff0c;考虑有限域…

redis哨兵模式下业务代码连接实现

目录 一&#xff1a;背景 二&#xff1a;实现过程 三&#xff1a;总结 一&#xff1a;背景 在哨兵模式下&#xff0c;真实的redis服务地址由一个固定ip转变为可以变化的ip,这样我们业务代码在连接redis的时候&#xff0c;就需要判断哪个主redis服务地址&#xff0c;哪个是从…

文件上传漏洞-上篇

一、概述 文件上传漏洞可以说是日常渗透测试中用得最多的一个漏洞&#xff0c;用它获得服务器权限最快最直接。在web程序中&#xff0c;经常需要用到文件上传的功能。如用户或者管理员上传图片&#xff0c;或者其它文件。如果没有限制上传类型或者限制不严格被绕过&#xff0c…

大数据学习-Hive

介绍 分布式 SQL 计算 做数据的统计分析&#xff0c;SQL 是最方便的工具 在大数据中&#xff0c;有很多的统计分析场景&#xff0c;那么 SQL 来处理大数据是非常合适且频繁的 以后可能就是 SQL Boy 了&#xff0c;所以学习前需要有 MySQL 的基础 Hive 的功能 是一个分布式…

【软件测试入门】测试用例经典设计方法 — 因果图法

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、因果图设计测试用例的步骤 1、分析需求 阅读需求文档&#xff0c;如果User Case很复杂&am…

电商项目测试实战之购物车页面用例设计

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、购物车页面 二、购物车页面测试范围列表 三、购物车页面功能点需求分析 四、部分功能点的测试…