常见的结构型设计模式

设计模式(二)

常见的结构型模式

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( ){
		// 没购买装备 ,攻击力和防御力都是60
		attack_ = 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;
}

效果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Solana链,什么是sol跟单机器人、pump跟单机器人、sol狙击机器人、sol夹子机器人、sol聪明钱筛选

Solana Sol跟单机器人&#x1f916; SOL跟单机器人&#xff08;Copy Trading Bot&#xff09;是一种自动化交易工具&#xff0c;允许用户复制其他成功交易者的交易行为。这种机器人通常用于加密货币市场、外汇市场等金融市场。以下是SOL跟单机器人的一些关键特性和功能&#xf…

yolov10--C#接口

一、前言 本章主要讲解yolov10的C#接口&#xff0c;主要是使用微软开发的openvinocsharp工具加载yolov10模型&#xff0c;并做推理。 二、yolov10模型转换 这里为了演示&#xff0c;使用官方yolov10m模型&#xff08;其他大小的模型同理&#xff09;做演示&#xff0c;可从下方…

iptables(5)常用扩展模块

简介 之前我们已经介绍过扩展模块的简单使用,比如使用-m tcp/udp ,-m multiport参数通过--dports,--sports可以设置连续和非连续的端口范围。那么我们如何匹配其他的一些参数呢,比如源地址范围,目的地址范围,时间范围等,这就是我们这篇文章介绍的内容。 iprange扩展模块…

Ubuntu系统下修改网卡IP地址

Ubuntu系统下修改网卡IP地址 一、Ubuntu系统介绍1.1 Ubuntu简介1.2 Ubuntu网络配置方式 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、配置网卡IP地址4.1 备份网卡配置文件4.2 查看当前IP地址4.3 修改…

0.15元1.5Mhz-1.3A同步整流BUCK降压DCDC芯片MT3410(MT3410LB)

前言 国产同步整流DCDC&#xff0c;参考价格约0.15元。 特征 高效率&#xff1a;高达 96% 1.5MHz恒定频率操作 1.3A 输出电流 无需肖特基二极管 2.3V至7V输入电压范围 输出电压低至 0.6V PFM 模式可在轻负载下实现高效率 压差操作中的100%占空比 低静态电流&#xff1a;35μ…

刘亦菲新剧玫瑰的故事

刘亦菲新剧《玫瑰的故事》&#xff1a;开放结局&#xff0c;无限遐想 当刘亦菲再次踏入荧屏&#xff0c;与导演汪俊携手打造的《玫瑰的故事》便引发了无数观众的期待与关注。这部剧不仅汇聚了众多实力派演员&#xff0c;更以其独特的剧情和精致的制作成为了近期热门的话题。《…

(项目实战)RocketMQ5.0延迟消息在聚合支付系统中的应用

1 基于业务场景掌握RocketMQ5.0 本篇文章主要结合聚合支付系统中的业务场景来落地RocketMQ中间件的应用&#xff0c;聚合支付系统主要在支付系统超时订单和商户支付结果异步通知场景中会使用到RocketMQ消息中间件。本文使用到了RocketMQ中的延迟消息知识点&#xff0c;RocketM…

JavaScript知识点大总结来了-------这一篇就足够啦!!!

JavaScript基础知识 一、对象的使用 1、创建对象 这里创建对象的方法我们采用最常用的一种&#xff1a; //第一种 <script>var Person {name: "zhangsan",age: "19",weight: "140",hight: "170",print:function(){console.…

【Android】我的手机在...自己下载...那个(浅析Intent基础运用)

【Android】我的手机在…自己下载…那个&#xff08;浅析Intent基础运用&#xff09; 在Android开发中&#xff0c;Intent&#xff08;意图&#xff09;是一个非常重要的概念。它不仅仅是用于在应用程序的各个组件之间进行通信的工具&#xff0c;也是启动新的Activity、Servic…

恭喜行云绽放,24年再度荣获国家鼓励的企业软件证书

在刚刚过去的五月份&#xff0c;行云绽放再次传来一个好消息&#xff0c;那就是2024年行云绽放再度荣获国家鼓励的企业软件证书。 什么是国家鼓励的企业软件证书&#xff1f; 国家鼓励的企业软件证书被称为“国家鼓励的软件企业证书”&#xff0c;这一证书由中国软件行业协会…

预制直埋聚氨酯保温管:卓越管道,引领未来

在管道领域中&#xff0c;预制直埋聚氨酯保温管宛如一颗璀璨明珠&#xff0c;散发着独特的光芒。 它具备卓越的保温性能&#xff0c;犹如给流体输送穿上了一层温暖的保护衣&#xff0c;有效减少热量损耗&#xff0c;实现高效的能源利用。其坚固的结构能够轻松应对各种复杂环境…

七析BI入门指南:数据资源管理

数据BI是指解决企业数据“最后一公里”&#xff0c;帮助企业全方位提高数据决策能力的数据可视化平台&#xff0c;提供平台级多租户管理&#xff0c;统一安全策略&#xff0c;精细化权限管理&#xff0c;支持与低代码平台接入集成&#xff0c;与七巧低代码平台高度融合。 数据B…

ssl证书90天过期?保姆级教程——使用acme.sh实现证书的自动续期

腾讯云相关文档相关参考-有的点不准确 前言 最近https到期了&#xff0c;想着手动更新一下https证书&#xff0c;结果发现证书现在的有效期只有90天&#xff0c;于是想找到一个自动更新证书的工具&#xff0c;发现了acme.sh&#xff0c;但是网上的文章质量参差不齐&#xff0…

Linux使用Docker部署mysql5.7

一、拉取镜像 docker pull mysql:5.7 二、查看镜像 docker images 三、创建容器 这里稍微解释下 -p参数是端口映射 -v参数是数据卷挂载 数据卷挂载是Docker中的一种功能&#xff0c;它允许将主机上的目录或文件系统与容器内的目录绑定&#xff0c;实现数据的持久化存储…

德璞资本:科技股波动解析,三巫日与日元效应下的市场走向

摘要 近期&#xff0c;美国科技股的表现令人担忧&#xff0c;标普500指数在科技股的拖累下出现下跌。亚洲股市也受到影响&#xff0c;特别是日本和韩国股市。随着期权到期日的临近&#xff0c;市场面临更大的波动风险。本文将详细分析科技股失去动能的原因、三巫日的影响及未来…

C#ListView的单元格支持添加基本及自定义任意控件

功能说明 使用ListView时&#xff0c;希望可以在单元格显示图片或其他控件&#xff0c;发现原生的ListView不支持&#xff0c;于是通过拓展&#xff0c;实现ListView可以显示任意控件的功能&#xff0c;效果如下&#xff1a; 实现方法 本来想着在单元格里面实现控件的自绘的…

消息队列kafka中间件详解:案例解析(第10天)

系列文章目录 1- 消息队列&#xff08;熟悉&#xff09;2- Kafka的基本介绍&#xff08;掌握架构&#xff0c;其他了解&#xff09;3- Kafka的相关使用&#xff08;掌握kafka常用shell命令&#xff09;4- Kafka的Python API的操作&#xff08;熟悉&#xff09; 文章目录 系列文…

拒绝吸烟,远离慢阻肺——朗格力复合营养素助力守护肺部健康

#肺科营养#朗格力#班古营养#复合营养素#肺部营养#肺部健康# 你知道吗?慢阻肺这一疾病在我国的患者数量已突破亿级大关,尤其在40岁以上的成年人中,平均每7个人中就有1位可能受其困扰。然而,很多人对慢阻肺的严重性认识不足,常常将其视为一种普通的咳嗽或喘息,忽视了它潜在的危…

ChatGPT 提示词技巧一本速通

目录 一、基本术语 二、提示词设计的基本原则 三、书写技巧 2.1 赋予角色 2.2 使用分隔符 2.2 结构化输出 2.3 指定步骤 2.4 提供示例 2.5 指定长度 2.6 使用或引用参考文本 2.7 提示模型进行自我判断 2.8 思考问题的解决过程 ​编辑 2.10 询问是否有遗漏 2.11 …

Consul 如何删除不需要的服务

一、找到需要删除的id 二、打开postman 使用put请求 http://ip:port/v1/agent/service/deregister/mc-admin-192-168-0-182-8084三、区域如果要验证输入验证