c++装饰器模式

前言

装饰器模式,就是可以对一个对象无限装饰一些东西,而且可以没有顺序。比如一个人可能只会说出他的名字,但是可以让他再说哈哈,可以说完哈哈之后再说哇哇。如何后面又不想装饰了,不需要改类原来的代码,直接在客户端不装饰即可;同样如果增加新的装饰,添加一个具体的装饰类即可,也不需要改变原来的代码。

代码

Person.h

#pragma once
#include<string>
#include<iostream>

class Person // 定义一个接口
{
public:
	virtual void show() = 0;
};


class NormalPerson : public Person // 实现接口的具体类,可能有不同种类的人,他们的show()操作不同
{
private:
	std::string _name;

public:
	NormalPerson(std::string name):_name(name){ }
	~NormalPerson() {}

	virtual void show() override {
		std::cout << "normal person: " << _name << std::endl;
	}
};

class PersonDecrator : public Person
{
private:
	Person* _pPerson;

public:
	PersonDecrator(Person* p_person) :_pPerson(p_person) {}

	virtual void show() override {
		if (_pPerson != nullptr) {
			_pPerson->show();
		}
		else {			
			std::cout << "_pPerson is nullptr" << std::endl;
		}
	}
};

// 装饰了haha的person
class DecratedHaHaPerson : public PersonDecrator
{
public:
	DecratedHaHaPerson(Person* p_person):PersonDecrator(p_person){}

	virtual void show() override
	{
		PersonDecrator::show(); // 调用父类方法
		hahaShow(); // 调用子类独有的haha show() 方法
	}

	void hahaShow() {
		std::cout << "hahahahaha" << std::endl;
	}
};

// 装饰了wawa的person
class DecratedWaWaPerson : public PersonDecrator
{
public:
	DecratedWaWaPerson(Person* p_person) :PersonDecrator(p_person) {}

	virtual void show() override
	{
		PersonDecrator::show(); // 调用父类方法
		wawaShow(); // 调用子类独有的haha show() 方法
	}

	void wawaShow() {
		std::cout << "wawawawawa" << std::endl;
	}
};

main.cpp

#include"Person.h"

int main()
{
	Person* pHablee = new NormalPerson("hablee");
	std::cout << "没有装饰任何的hablee的show: " << std::endl;
	pHablee->show();
	std::cout << std::endl;

	// 装饰一下haha
	pHablee = new DecratedHaHaPerson(pHablee);
	std::cout << "装饰了haha的hablee的show" << std::endl;
	pHablee->show();
	std::cout << std::endl;

	// 再装饰一个wawa
	pHablee = new DecratedWaWaPerson(pHablee);
	std::cout << "装饰了haha和wawa的hablee的show" << std::endl;
	pHablee->show();
	std::cout << std::endl;

	delete pHablee;

	return 0;
}

结果

在这里插入图片描述

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

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

相关文章

基础课15——语音标注

语音数据标注是对语音数据进行处理和分析的过程&#xff0c;目的是让人工智能系统能够理解和识别语音中的信息。这个过程包括了对语音信号的预处理、特征提取、标注等步骤。 在语音数据标注中&#xff0c;标注员需要对语音数据进行分类、切分、转写等操作&#xff0c;让人工智…

【数据库】形式化关系查询语言(一):关系代数Relational Algebra:基本运算、附加关系代数、扩展的关系代数

目录 一、关系代数Relational Algebra 1. 基本运算 a. 选择运算&#xff08;Select Operation&#xff09; b. 投影运算&#xff08;Project Operation&#xff09; 组合 c. 并运算&#xff08;Union Operation&#xff09; d. 集合差运算&#xff08;Set Difference Op…

uniapp 使用 UDP

一、搭建UDP服务端&#xff0c;nodejs const dgram require("dgram");const message Buffer.from("你好&#xff0c;这是一个UDP广播消息"); const port 3000; // 用你想要的端口替换这里// 创建一个UDP套接字 const socket dgram.createSocket("…

目标检测理论知识

目标检测 1.基本概念 目标检测&#xff08;Object Detection&#xff09;的任务是找出图像中所有感兴趣的目标&#xff08;物体&#xff09;&#xff0c;确定它们的类别和位置&#xff0c;是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态&#xff0c;…

搜索二叉树

单纯的二叉树&#xff0c;并不能体现出优秀的存储和查找能力&#xff0c;但是对二叉树附加一些规则&#xff0c; 就能让二叉树成为很高效的存储和查找的一种数据结构&#xff0c;所以今天会介绍&#xff0c;基于二 叉树和一些附加规则的树——搜索二叉树1.搜索二叉树 搜索二叉…

WINCC7.5-根据时间跨度选择趋势

yyyy-MM-dd hh:mm:ss “yyyy”&#xff1a;表示四位数的年份&#xff0c;例如&#xff1a;2022。 “MM”&#xff1a;表示两位数的月份&#xff0c;从01到12。 “dd”&#xff1a;表示两位数的日期&#xff0c;从01到31。 “hh”&#xff1a;表示12小时制的小时数&#xff0c;从…

maven之父子工程版本控制案例实战,及拓展groupId和artifactId的含义

<parent>标签 用于父子工程项目&#xff0c;什么是父子工程&#xff1f; 顾名思义&#xff0c;maven父子项目是一个有一个父项目&#xff0c;父项目下面又有很多子项目的maven工程&#xff0c;当然&#xff0c;子项目下面还可以添加子项目&#xff0c;从而形成一个树形…

第4天:基础入门-30余种加密编码进制amp;Webamp;数据库amp;系统amp;代码amp;参数值

第4天&#xff1a;基础入门-30余种加密编码进制&Web&数据库&系统&代码&参数值 一、知识点 1. 存储密码加密-Web&数据库&系统2. 传输数据编码-各类组合传输参数值3. 代码特性加密-JS&PHP&NET&JAVA4. 数据显示编码-字符串数据显示编码二…

Android APT的使用

Apt 介绍 APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的 Annotation&#xff0c;根据注解自动生成代码。 Annotation 处理器在处理 Annotation 时可以根据源文件中的 Annotation 生成额外的源文件和其它的文件(文件具体内容由 Annot…

c++实现策略模式

前言 看了一会儿大话设计模式&#xff0c;我感觉平常的话&#xff0c;策略模式还挺常用的&#xff0c;记录一下。个人理解策略模式&#xff0c;就是抽象一个算法&#xff0c;然后你可以有很多不同的实现&#xff0c;这些实现去重写抽象算法的虚方法。然后在一个上下文类中有一…

win10pycharm和anaconda安装和环境配置教程

windows10 64位操作系统下系统运行环境安装配置说明 下载和安装Anaconda&#xff0c;链接https://www.anaconda.com/download 下载完后&#xff0c;双击exe文件 将anaconda自动弹出的窗口全部关掉即可&#xff0c;然后配置高级系统变量 根据自己的路径&#xff0c;配置…

C++ Qt QLineEdit如何响应回车事件

在Qt开发中,回车键的处理很常见,本篇博客介绍在QLineEdit里回车键的处理方法,例如下面的界面: QLineEdit回车键的处理有方式,一是链接returnPressed信号,二是用事件过滤。下面分别介绍这两种方式。 一、returnPressed信号 可以查看QLineEdit的头文件声明,有如下信号:…

量化交易Copula建模应对市场低迷

一、简介 传统上,我们依靠相关矩阵来理解资产间的动态。然而,正如过去的市场崩盘所表明的那样,当风暴袭来时,许多模型都会陷入混乱。突然之间,相关性似乎趋于一致,而多样化这一经常被吹捧的风险管理口号似乎并没有提供什么庇护。 这种出乎意料的同步,即资产在经济低迷时…

服务器带宽忽然暴增,不停的触发告警

问题&#xff1a; 线上环境&#xff0c;服务器的外网下行带宽达到某个阈值&#xff0c;触发告警&#xff0c;查了下服务器的带宽监控信息&#xff0c;是从某个时间开始突然串上去的&#xff0c;然后监控图形非常有规律&#xff0c;都是每秒达到顶峰后&#xff0c;又立马下去了…

新一代构建工具Vite-xyphf

一、什么vite? vite:是一款思维比较前卫而且先进的构建工具,他解决了一些webpack解决不了的问题——在开发环境下可以实现按需编译&#xff0c;加快了开发速度。而在生产环境下&#xff0c;它使用Rollup进行打包&#xff0c;提供更好的tree-shaking、代码压缩和性能优化&…

基于tpshop开发多商户源码支持手机端+商家+门店 +分销+淘宝数据导入+APP+可视化编辑

tpshop多商户源码,tpshop商城源码,tpshop b2b2c源码-支持手机端商家门店 分销淘宝数据导入APP可视化编辑 tpshop商城源码算是 thinkphp框架里做的比较早 比较好的源码了&#xff0c;写法简明 友好面向程序猿。 这是一款前几年的版本 虽然后台看着好了些&#xff0c;丝毫不影响…

云安全与容器安全: 探讨在云环境和容器化应用中如何保护数据和工作负载的安全。

在当今数字化时代&#xff0c;云计算和容器化应用已经成为了企业业务的主要组成部分。这两项技术的普及&#xff0c;极大地提高了开发和部署的效率&#xff0c;但也带来了新的安全挑战。在本文中&#xff0c;我们将探讨云安全和容器安全的重要性&#xff0c;以及如何有效地保护…

2023-macOS下安装anaconda,终端自动会出现(base)字样,如何取消

2023-macOS下安装anaconda&#xff0c;终端自动会出现(base)字样&#xff0c;如何取消 安装后&#xff0c;我们再打开终端&#xff0c;就会自动出现了&#xff08;base&#xff09; 就会出现这样子的&#xff0c;让人头大&#xff0c; 所以我们要解决它 具体原因是 安装了anac…

外网远程登录之 NAT server

案例&#xff1a; 外网远程登录内网SW&#xff1a; 需求 1.内网的PC都可以访问Server1 2.外网的R2可以远程登录SW1&#xff0c; 用户名和密码是&#xff1a;HCIE/hehe 需求 1.内网的PC都可以访问Server1 2.外网的R2可以远程登录SW1&#xff0c; 用户名和密码是&#xff1a;HCI…

Centos下用nodejs实现一个简单的web服务器

WebRTC是音视频直播中最常用的一个框架&#xff0c;在使用的过程中&#xff0c;我们就需要实现一个服务器端。本文以nodejs实现一个服务器为例&#xff0c;讲述一下在centos下如何用nodejs实现一个简单的web服务器。 一、安装nodejs 在linux环境下安装nodejs有多重方式&#x…