常见的结构型设计模式

news2024/11/13 3:56:01

设计模式(二)

常见的结构型模式

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;
}

效果:

在这里插入图片描述

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

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

相关文章

Qt 实战(6)事件 | 6.1、事件机制

文章目录 一、事件1、基本概念2、事件描述3、事件循环4、事件分发4.1、QApplication::notify()4.2、QObject::event() 5、事件传递6、事件处理器 前言&#xff1a; Qt 框架中的事件机制&#xff08;Event Mechanism&#xff09;是一种核心功能&#xff0c;它允许应用程序以事件…

仓库管理系统04--创建业务逻辑

1、添加业务逻辑类 然后依次添加其他的类 2、创建所有DB操作的接口类 3、业务逻辑实现接口类 实现接口的客户类方法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq;namespace…

Mybatis-Plus学习|快速入门CRUD、主键生成策略(雪花算法、主键自增等)、自动填充、乐观锁、分页插件、逻辑删除

MyBatisPlus概述 为什么要学习它呢?MyBatisPlus可以节省我们大量工作时间&#xff0c;所有的CRUD代码它都可以自动化完成! JPA、tk-mapper、MyBatisPlus 偷懒的! MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff…

springboot网上商城系统-计算机毕业设计源码08789

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设网上商城系统。 本设…

WMS可以为制造企业解决什么问题?

在快速变化、高度竞争的制造业环境中&#xff0c;仓库不仅是储存物料的地方&#xff0c;更是企业运营的“心脏”。然而&#xff0c;随着业务的扩展和产品种类的增多&#xff0c;仓库管理变得越来越复杂&#xff0c;传统的管理方式已经难以满足现代企业的需求。这时&#xff0c;…

Verilog HDL语法入门系列(二):Verilog的语言文字规则

目录 1 空白符和注释2 整数常量和实数常量3 整数常量和实数常量4 字符串&#xff08;string)5 格式符与转义符6 标识符(identifiers) 微信公众号获取更多FPGA相关源码&#xff1a; 1 空白符和注释 2 整数常量和实数常量 Verilog中&#xff0c;常量(literals)可是整数也可以是…

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

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

通用创新点:坐标注意力机制!低成本下表现依旧SOTA

同学们&#xff0c;今天我们来聊聊坐标注意力。 坐标注意力是一种非常高效的注意力机制&#xff0c;它通过将位置信息嵌入到通道注意力中&#xff0c;轻轻松松就能提高轻量级网络的性能。 这一机制的核心在于其创新的结构和对位置信息的精确捕捉能力&#xff0c;允许模型在强…

缓存双写一致性(笔记)

缓存更新方案 旁路缓存模式 这是比较多的 旁路缓存模式&#xff1a;缓存有就返回&#xff0c;没有数据库查询&#xff0c;放入缓存返回。 还有些常用缓存策略 读穿透模式 读穿透和旁路很相似&#xff0c;程序不需要关注从哪里读取数据&#xff0c;它只需要从缓存查询数据。…

机器学习-保存模型并根据模型进行预测 python demo

文章目录 前言机器学习-保存模型&#xff0c;根据模型进行预测python demo1. 将我们创建的线性回归模型保存到本地2. 利用我们保存的模型进行房价预测 demo2. 利用我们保存的模型生成对应的预测线性图 demo 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评…

LLM大语言模型-AI大模型全面介绍

简介&#xff1a; 大语言模型&#xff08;LLM&#xff09;是深度学习的产物&#xff0c;包含数十亿至数万亿参数&#xff0c;通过大规模数据训练&#xff0c;能处理多种自然语言任务。LLM基于Transformer架构&#xff0c;利用多头注意力机制处理长距离依赖&#xff0c;经过预训…

一个土木工程专业背景的开发者,讲述开源带给他的力量

在前段时间我们举办的“TDengine Open Day”第一季技术沙龙中&#xff0c;TDengine 应用研发高级工程师谭雪峰进行的“开源之路&#xff1a;程序员的成长与探索”主题分享获得了众多参会者的好评。谭雪峰从自身独特的职业发展经历出发&#xff0c;分享了自己在开源领域的种种收…

DM达梦数据库字符串函数整理

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

视觉理解与图片问答,学习如何使用 GPT-4o (GPT-4 Omni) 来理解图像

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、引言 OpenAI 最新发布的 GPT-4 Omni 模型&#xff0c;也被称为 GPT-4o&#xff0c;是一个多模态 AI 模型&#xff0c;旨在提供更加自然和全面的人机交互体验。 GPT-4o 与 GPT-4 Turbo 都具备视觉功…

3d中模型显示黑色给不了材质---模大狮模型网

如果3D模型显示黑色&#xff0c;而且无法给它添加材质&#xff0c;可能有以下几种原因&#xff1a; 一&#xff1a;模型没有UV贴图 UV贴图是3D模型表面纹理的一种方式&#xff0c;如果模型没有正确的UV贴图&#xff0c;渲染时可能会显示黑色。在大多数3D建模软件中&#xff0c…

Telnet远程登录(Cisco)

Telnet 基于TCP/IP协议族 远程终端协议 在Internet上远程登录 VTY(Virtual Teletype) 通过IP连接物理上的终端 实现在Internet上 登陆和配置远程目标终端 A Router>enable Router#config Router(config)#hostname A A(config)#interface gigabitEthernet 0/0 A(confi…

归并排序与快速排序总结-c++

一&#xff0c;归并排序 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法。该算法分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。 作为一种典型的分而治之思想的算法应用&#xff0c;归并排序的实现由两种方法…

机器学习/pytorch笔记:time2vec

1 概念部分 对于给定的标量时间概念 t&#xff0c;Time2Vec 的表示 t2v(t)是一个大小为 k1的向量&#xff0c;定义如下&#xff1a; 其中&#xff0c;t2v(t)[i]是 t2v(t)的第 i 个元素&#xff0c;F是一个周期性激活函数&#xff0c;ω和 ϕ是可学习的参数。 以下是个人理解&am…

最热门的智能猫砂盆好不好用?这期统统告诉你!

身为上班族的我们&#xff0c;常常被工作和出差填满日程。忘记给猫咪铲屎也不是一次两次了。但我们必须意识到&#xff0c;不及时清理猫砂盆不仅会让猫咪感到不适&#xff0c;还可能引发泌尿系统感染、皮肤疾病等健康问题。为了解决这个问题&#xff0c;越来越多的铲屎官开始将…

JavaWeb——MySQL:navicate客户端工具简单使用

目录 1. 连接 2. 新建数据库 3. 使用数据库 4. 新建表 5.使用表 6. 导出数据库 我这里是英文版&#xff0c;没有进行汉化。 1. 连接 点击左上角Connection&#xff0c;选择MySQL&#xff0c;&#xff08;我连接的是自己计算机上的数据库&#xff09;连接名输入&#x…