常见的结构型设计模式

设计模式(二)

常见的结构型模式

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.rhkb.cn/news/360332.html

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

相关文章

Charles抓取安卓应用https包演示

一、准备软件 夜神安卓模拟器 (yeshen.com) Charles (charlesproxy.com) 二、配置抓包 2.1 Charles安装PC根证书 记住这里的ip端口 三、安卓模拟器配置 3.1 配置安卓客户端网络代理 填写上文的ip端口&#xff0c;保存 3.2 安装根证书 3.2.1 导出根证书 linux主机执行 op…

《QT从基础到进阶·七十二》基于Qt开发的文件保险柜工具并支持文件各种加密和解密

1、概述 源码放在文章末尾 该项目实现了文件各种加密和解密的功能&#xff0c;能够有效的保障文件的安全&#xff0c;主要包含如下功能&#xff1a; 1、支持所有 AES 密钥长度&#xff1b; AES_128 AES_192 AES_256 2、支持ECB、CBC、CFB、OFB四种模式&#xff1b; 3、支持ZER…

java版CRM客户关系管理系统Spring Cloud alibaba Spring Boot成长型企业必备的客户关系管理系统

鸿鹄CRM客户关系管理系统是一款基于Java语言开发的CRM系统&#xff0c;采用了Spring Cloud Alibaba、Spring Boot、MybatisPlus、Redis和VUE3 ElementUI等技术&#xff0c;构建了一个微服务架构。该系统具有以下功能模块&#xff1a; 一、待办事项 1、今日需联系客户&#xf…

python根据excel的文件创建文件夹

这几天要整理一点文档&#xff0c;需要批量生成一些文件夹&#xff0c;&#xff08;其实也可以进一步自动生成各种文档&#xff09;&#xff0c;用到了py的功能&#xff0c;在此记录一下。 1.准备工作 需要两个库支持openpyxl和os 安装 pip install openpyxl2.代码思路 打算…

KubeSphere 在互联网电商行业的应用实践

来自社区用户&#xff08;SRE运维手记&#xff09;投稿 背景 在云原生的时代背景下&#xff0c;Kubernetes 已经成为了主流选择。然而&#xff0c;Kubernetes 的原生操作复杂性和学习曲线较高&#xff0c;往往让很多团队在使用和管理上遇到挑战。因此&#xff0c;市面上出现了…

乌班图Ubuntu 24.04初始化MySQL报错error while loading shared libraries: libaio.so.1

由于乌班图24.04 LTS已经发布了&#xff0c;因此准备新业务逐步往这上面迁移&#xff0c;毕竟支持有效期比22.04更长 准备在24.04上进行MySQL的初始化&#xff0c;因为习惯自定义安装存储目录&#xff0c;所以使用mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz这个最新的二进制版…

【面试实战】# 并发编程之线程池配置实战

1.先了解线程池的几个参数含义 corePoolSize (核心线程池大小): 作用: 指定了线程池维护的核心线程数量&#xff0c;即使这些线程处于空闲状态&#xff0c;它们也不会被回收。用途: 核心线程用于处理长期的任务&#xff0c;保持最低的线程数量&#xff0c;以减少线程的创建和…

【Unity拖拽物体】实现对点中的3D物体进行拖拽的功能

场景结构&#xff0c;两个普通模型 第一种 脚本所挂载的物体才可以被拖拽 【PC鼠标版本】 using UnityEngine;// 这个脚本实现了&#xff0c;本脚本所在的游戏物体能够被拖拽 public class DragObjectT : MonoBehaviour {private Vector3 screenPoint; // 存储物体在屏幕上的位…

docker基础使用教程

1.准备工作 例子&#xff1a;工程在docker_test 生成requirements.txt文件命令&#xff1a;&#xff08;使用参考链接2&#xff09; pip list --formatfreeze > requirements.txt 参考链接1&#xff1a; 安装pipreqs可能比较困难 python 项目自动生成环境配置文件require…

【C语言】解决C语言报错:Invalid Pointer

文章目录 简介什么是Invalid PointerInvalid Pointer的常见原因如何检测和调试Invalid Pointer解决Invalid Pointer的最佳实践详细实例解析示例1&#xff1a;未初始化的指针示例2&#xff1a;已释放的指针示例3&#xff1a;返回局部变量的指针示例4&#xff1a;野指针 进一步阅…

5个wordpress成品站主题

Sora索啦高端制造业wordpress主题 红色高端制造业wordpress主题&#xff0c;适合外贸企业出海建独立站的wordpress模板。 https://www.jianzhanpress.com/?p5885 Polar钋啦wordpress外贸主题 制造业wordpress网站模板&#xff0c;适合生产制造企业官方网站使用的wordpress外…

汉语翻译藏语软件,这几款软件不妨一试!

在全球化日益加深的今天&#xff0c;语言障碍成为了许多人在文化交流、商务洽谈或旅游探险中不得不面对的问题。特别是对于汉语和藏语这两种语言来说&#xff0c;由于其独特的文化背景和语法结构&#xff0c;翻译起来更是难上加难。不过&#xff0c;好在科技的进步为我们带来了…

Intelij IDEA中Mapper.xml无法构建到资源目录的问题

问题场景&#xff1a; 在尝试把原本在eclipse上的Java Web项目转移至Intelij idea上时&#xff0c;在配置文件均与eclipse一致的情况下出现了如下报错&#xff1a; org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.umbrella.crm_core.…

图书管理系统(详解版 附源码)

目录 项目分析 实现页面 功能描述 页面预览 准备工作 数据准备 创建数据库 用户表 创建项目 导入前端页面 测试前端页面 后端代码实现 项目公共模块 实体类 公共层 统一结果返回 统一异常处理 业务实现 持久层 用户登录 用户注册 密码加密验证 添加图书…

Mac 安装HomeBrew(亲测成功)

1、终端安装命令&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"执行后&#xff0c;没有安装git&#xff0c;会先安装&#xff0c;安装后再执行一下命令。 2、根据中文选择源安装 3、相关命令 查看版本号&a…

本地服务怎么发布成rpc服务

目录 1.引入 2.user.proto 3.userservice.cc 1.引入 example文件夹作为我们框架项目的使用实例&#xff0c;在example文件夹下创建callee和caller两个文件夹 callee是RPC服务的提供者。在callee创建一个文件&#xff1a;userservice.cc 我们有没有这样一个框架&#xff0c;把…

【面试题】MySQL数据库

目录 什么是视图&#xff0c;视图的作用是什么&#xff1f;什么是索引&#xff1f;MySQL中有哪些类型的索引&#xff1f;简述索引设计原则&#xff1f;简述索引的数据结构&#xff1f;简述Hash 和 B 树索引的区别&#xff1f;列出MySQL中导致索引失效的情况&#xff1f;简述数据…

mysql窗口函数排名查询 与 连续出现的数字查询

排名查询 学会这一个查询&#xff0c;我们应该对该类型的查询 方法就能有一个了解&#xff0c;不然 如果下次遇到该类型的查询&#xff0c;我们依然分析不出 给你一张表&#xff0c;里面有id 和score字段&#xff0c;根据score的分数大小 排序 &#xff0c;假如有相同的分数&…

【山东】2024年夏季高考文化成绩一分一段表

文末有图片版&#xff0c;可直接保存下载&#xff01;&#xff01; 2024年夏季高考文化成绩一分一段表分数段全体-选考物理-选考化学-选考生物-选考思想政治-选考历史-选考地理分数段本段人数累计人数本段人数累计人数本段人数累计人数本段人数累计人数本段人数累计人数本段人…

Upload-Labs-Linux1 使用 一句话木马

解题步骤&#xff1a; 1.新建一个php文件&#xff0c;编写内容&#xff1a; <?php eval($_REQUEST[123]) ?> 2.将编写好的php文件上传&#xff0c;但是发现被阻止&#xff0c;网站只能上传图片文件。 3.解决方法&#xff1a; 将php文件改为图片文件&#xff08;例…