【21】c++设计模式——>装饰模式

news2024/9/24 15:22:46

装饰模式的定义

装饰模式也可以称为封装模式,所谓的封装就是在原有行为之上进行扩展,并不会改变该行为;
例如网络通信:
在进行网络通信的时候,数据是基于IOS七层或四层网络模型(某些层合并之后就是四层模型)进行传输,通过下图可得知从应用层到物理层,数据每向下走一层就会被封装一层,最后将封装好的数据以比特流的方式发送给接收端。封装之后数据只是变得更复杂了, 并没有改变它是数据的本质。
在这里插入图片描述
加解密是对数据的装饰,但是没有改变数据的本质。
防护服是对人的装饰,没有改变本体是人的本质。

装饰模式组成装饰模式是一种结构型设计模式,他允许你在运行时为对象动态的添加新的行为,而无需修改其源代码。

在装饰模式中,有四个主要角色:
抽象组件:定义了被装饰对象的接口,它可以是一个抽象类或接口。在抽象组件中定义了待装饰对象的基本操作;
具体组件:实现了抽象组件的接口,是被装饰的原始对象
装饰器:实现了抽象组件接口,并持有一个抽象组件对象的引用。装饰器可以通过对被装饰对象的包装来扩展其功能。
具体装饰器:具体装饰器是装饰器的具体实现,它通过在具体组件的基础上添加额外的功能来装饰对象。

代码实例

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

/*我要做的是写一个吃了很多恶魔果实的黑胡子,
* 每吃一个恶魔果实,黑胡子就会获得相应的技能
* 这个就相当于装饰自己
*/
/*定义一个抽象战士类
*有了这个抽象类就可以对某个人,或者某个恶魔果实的战力进行具体的实现
*这个类有两个方向
* 1.派生出某个具体的战士,比如黑胡子
* 2.派生出恶魔果实类,因为战士是恶魔果实的载体,这些恶魔果实可以装饰这个战士
*/
class Soldier
{
public:
	Soldier() {}
	Soldier(string name) :m_name(name) {}
	string getName()
	{
		return m_name; //获取战士的名字
	}
	virtual void fight() {}  //所有战士都可以战斗
	virtual ~Soldier() {}
protected:
	string m_name = string(); //战士的名字
};
//实例化战士:黑胡子
class Teach :public Soldier
{
public:
	using Soldier::Soldier;//继承构造,使用父类的构造函数,不是很理解这个东西
	void fight() override
	{
		cout <<m_name << "依靠惊人的力量和高超的体术战斗..." << endl;
	}
};
/*恶魔果实基类
*这里一件很重要额操作就是指定载体,就是这个恶魔果实谁来吃
*这个还是个抽象类,因为没有重写父类的fight方法
*派生3个类:暗暗果实,大饼果实,震震果实
*/
class DevilFruit :public Soldier
{
public:
	//附魔函数,指定载体
	void enchantment(Soldier* soldier)
	{
		m_soldier = soldier;
		m_name = soldier->getName();
	}
protected:
	Soldier* m_soldier = nullptr;
};
/*暗暗果实
* 继承恶魔果实
*/
class DarkFruit :public DevilFruit
{
public:
	void fight() override
	{
		m_soldier->fight();//吃果实前的能力
		cout << m_soldier->getName()<< "吃了暗暗果实, 可以拥有黑洞一样的无限吸引力..." << endl;
	}
private:
	void warning() //定义类独有的方法
	{
		cout << m_soldier->getName()	<< "你要注意: 吃了暗暗果实, 身体元素化之后不能躲避攻击,会吸收所有伤害!" << endl;
	}
};

/*震震果实
* 继承恶魔果实
*/
class QuakeFruit :public DevilFruit
{
public:
	void fight() override
	{
		m_soldier->fight();
		cout << m_soldier->getName()			<< "吃了震震果实, 可以在任意空间引发震动, 摧毁目标...!" << endl;
	}
};

// 大饼果实
class PieFruit : public DevilFruit
{
public:
	void fight() override
	{
		m_soldier->fight();
		cout << m_soldier->getName()<< "吃了大饼果实, 获得大饼铠甲...!" << endl;
		ability();
	}

	void ability()
	{
		cout << "最强辅助 -- 大饼果实可以将身边事物变成大饼, 帮助自己和队友回血..." << endl;
	}
};
int main()
{
	Soldier* teach = new Teach("黑胡子");
	DevilFruit* dark = new DarkFruit;
	DevilFruit * quake = new QuakeFruit;
	DevilFruit* pie = new PieFruit;

	dark->enchantment(teach); //用暗暗果实装饰黑胡子
	quake->enchantment(dark); //用震震果实装饰吃了暗暗果实的黑胡子
	pie->enchantment(quake); //用大饼果实装饰吃了暗暗果实和震震果实的黑胡子

	pie->fight();

	delete pie;
	delete quake;
	delete dark;
	delete teach;

	return 0;

}

在这里插入图片描述

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

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

相关文章

Rn使用FlatList导航栏自动回到中间

import { useState, useRef } from react import { FlatList, View, Text, StyleSheet, TouchableOpacity } from react-nativeconst Center () > {const tabs ["语文", "数学", "英语", "政治", "历史", "地理&q…

新的“HTTP/2 快速重置”零日攻击打破了 DDoS 记录

自 8 月份以来&#xff0c;一种名为“HTTP/2 快速重置”的新 DDoS&#xff08;分布式拒绝服务&#xff09;技术已被作为零日漏洞积极利用&#xff0c;其规模打破了之前的所有记录。 Amazon Web Services、Cloudflare 和 Google 今天联合发布了有关零日技术的消息&#xff0c;他…

PHP 自习室空位查询系统mysql数据库web结构apache计算机软件工程网页wamp计算机毕业设计

一、源码特点 PHP 自习室空位查询系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php 自习室空位查询系统1 代码 https://download.csdn.net/download/qq_41221322/…

聊聊身边的嵌入式:点菜机用着好好的,突然挂了,这口锅应该甩给谁?

周末被老婆challenge了。之所以用这个英文词汇&#xff0c;是因为实在难以找出一个恰当的中文&#xff0c;来表达这个意思。挑战&#xff1f;盘问&#xff0c;质疑&#xff1f;臭骂&#xff1f;好像都不对劲儿。对了&#xff0c;想来想去&#xff0c;只有diao这个词有点儿接近&…

小视频APP源码实战:探寻成功案例与经验分享

在这个数字化时代&#xff0c;小视频APP源码已经成为创业者们追逐成功的热门选择。本文将揭示三个成功案例&#xff0c;为您带来宝贵的经验分享。 案例一&#xff1a;「绝绝子」&#xff0c;小视频APP带来的逆袭奇迹 小视频APP「绝绝子」的成功故事令人瞩目。通过精心策划的内…

[网鼎杯 2018]Comment git泄露 / 恢复 二次注入 .DS_Store bash_history文件查看

首先我们看到账号密码有提示了 我们bp爆破一下 我首先对数字爆破 因为全字符的话太多了 爆出来了哦 所以账号密码也出来了 zhangwei zhangwei666 没有什么用啊 扫一下吧 有git git泄露 那泄露看看 真有 <?php include "mysql.php"; session_start(); if(…

TWDS车辆轮对故障、尺寸动态检测系统

随着我国铁路的建设发展&#xff0c;客运专线网络形成&#xff0c;既有铁路的货运能力得到释放&#xff0c;货物运输向重载方向发展&#xff0c;运输组织呈现长交路、运转周期短、编组固定的特点。 跟踪调查表明重载车辆车轮磨耗较普通车辆更为严重。大秦线c80型车辆在不到1个…

vue3+ts项目02-安装eslint、prettier和sass

创建项目 项目创建 安装eslint yarn add eslint -D生成配置文件 npx eslint --init安装其他插件 yarn add -D eslint-plugin-import eslint-plugin-vue eslint-plugin-node eslint-plugin-prettier eslint-config-prettier eslint-plugin-node babel/eslint-parser vue-e…

前端好文+插件分享(持续更新中...)

CSS 「滚动绽放」实现页面滚动时逐渐展示/隐藏元素https://github.com/vnyoon/web-magic &#xff08;相关CSS动画特效实现&#xff09; 钉钉官网首页的炫酷动效” 被我用css新特性轻松破解啦&#xff5e; 软件开发 1 模型驱动是什么意思&#xff1f;底层原理是什么&#xf…

Linux发布Java项目,使用screen窗口

代码写完正常的打包 登录Linux&#xff0c;使用screen -ls命令查看现有的窗口 将之前的jar备份一个cp 原jar包名 备份后jar包名&#xff0c;再将jar包复制到对应的路径下 使用screen -r -d 窗口名 命令进入到之前启动jar包的窗口&#xff0c;停掉之前的窗口&#xff0c;直接…

无法打开文件“opengl32.lib”

无法打开文件“opengl32.lib” [TOC](无法打开文件“opengl32.lib”) 前言一、找到库链接配置勾选继承input里也要勾选继承 前言 随便找个教程配置结果报错无法打开文件opengl32.lib 分析原因&#xff1a; opengl库和windows自带库一样出问题应该是VS配置有问题 提示&#xff…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS进阶(二)

思维导图 构造函数&数据常用函数 一、深入对象 1.1创建对象三种方式 1.2 构造函数 1.3实例成员&静态成员 二、内置构造函数 为什么简单数据类型也有方法? 基本数据类型包装成复杂数据类型 2.1 Object 2.2 Array reduce() 第二个参数&#xff08;初始值&#xff09;不…

rust cfg的使用

前提是一个crate倒入另一个crate。 先看结构 test_lib目录结构 这与另一个crate处于同一个目录,所以另一crate倒入的时候在Cargo.toml中使用如下语句。 test_lib = {path = "../test_lib" }先在test_lib/src/abc/abc.rs中添加没有cfg的两个函数做测试。 pub fn…

Tabby All configured authentication methods failed

文章目录 重要序言错误原因tabby的连接设置 总结 重要序言 Tabby是一款美观耐用的软件&#xff0c;平常一直用来输入密码方法SSH公司服务器&#xff0c;后来为了另外一台服务器加了SSH私钥&#xff0c;之后Tabby SSH连接死活不成功&#xff0c;哎&#xff0c;折腾了好久&#…

【VS Code】推荐一套我非常喜欢的主题和字体样式

话不多说&#xff0c;先上样式&#xff1a; 这里我的主题是 One Dark Pro&#xff0c;也是 VS Code 里面使用非常多的主题之一。直接安装插件即可使用。 我的字体是 JetBrains Mono&#xff0c;虽然使用的是 VS Code&#xff0c;但还是喜欢 webstorm 的字体。我们可以直接去官网…

随着 ChatGPT 凭借 GPT-4V(ision) 获得关注,多模态 AI 不断发展

原创 | 文 BFT机器人 在不断努力让人工智能更像人类的过程中&#xff0c;OpenAI的GPT模型不断突破界限GPT-4现在能够接受文本和图像的提示。 生成式人工智能中的多模态表示模型根据输入生成文本、图像或音频等各种输出的能力。这些模型经过特定数据的训练&#xff0c;学习底层模…

ssm+vue的车辆出租管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的车辆出租管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

Android系统修改AOSP输入法默认输入语言

Android系统中的Android键盘(AOSP)有个语言设置选项,里面默认的是“使用系统语言”,现在客户要求关闭默认“使用系统语言”,打开美式英语。即默认如下图: 网上很多方法都是设置输入法的Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE属性为 -921088104。实际测试在Andr…

go 项目打包部署到服务器

1、window打包到Linux 步骤1 依次执行一下命令&#xff0c;就会得到一个exe 文件 步骤2 把打包的文件&#xff0c;放到服务器上&#xff08;可以使用FinalShell工具&#xff09; chmod x main # 执行这个命令&#xff0c;给main 文件添加 执行权限&#xff0c;然后执行 ls &…

【数据结构】队列(Queue)实现详解

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;数据结构 &#x1f525;该文章主要了解实现队列的相关操作。 目录&#xff1a; &#x1f30d; 队列&#x1f52d;概念&#x1f52d;结构&…