c++装饰器模式

news2025/2/25 15:27:26

前言

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

代码

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

结果

在这里插入图片描述

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

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

相关文章

什么是数字展览馆,数字展览馆有什么应用前景

引言&#xff1a; 数字展览馆作为一种新兴的文化艺术展示形式&#xff0c;以数字化技术和虚拟现实为基础&#xff0c;正在逐渐改变传统展览的方式。 一、什么是数字展览馆&#xff1f; 1.定义 数字展览馆是利用数字技术和虚拟现实技术打造的一种线上文化艺术展示平台。通过虚…

基于springboot实现疫情防控期间外出务工人员信息管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot疫情防控期间外出务工人员信息管理系统 摘要 网络的广泛应用给生活带来了十分的便利。所以把疫情防控期间某村外出务工人员信息管理与现在网络相结合&#xff0c;利用java技术建设疫情防控期间某村外出务工人员信息管理系统&#xff0c;实现疫情防控期间某村外出…

《完蛋!我被美女包围了》突然火了!世界首个开源贡献榜出炉丨 RTE 开发者日报 Vol.75

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

我的天!阿里云服务器居然比腾讯云优惠1元!

2023阿里云服务器优惠活动来了&#xff0c;以前一直是腾讯云比阿里云优惠&#xff0c;阿里云绝地反击&#xff0c;放开老用户购买资格&#xff0c;99元服务器老用户可以买&#xff0c;并且享受99元续费&#xff0c;阿腾云亲测可行&#xff0c;大家抓紧吧&#xff0c;数量不多&a…

Mac上的iTerm2和Oh My Zsh 的安装(安装过程和失败详解)

前言&#xff08;无重点&#xff0c;安装往后看&#xff09; 由于在很多人的安利下&#xff0c;说很好用&#xff0c;作者今天花费了4个小时用血的教训总结出来的安装教程&#xff0c;我在安装过程中遇到的最大的问题就是 1. curl: (7) Failed to connect to raw.githubusercon…

电影《河边的错误》观后感

上周看了电影《河边的错误》&#xff0c;整部电影看介绍&#xff0c;是改编余华的小说&#xff0c;并且获得多种奖项&#xff0c;一般来说&#xff0c;差不了&#xff0c;看完之后&#xff0c;只能说&#xff0c;看得有些云里雾里的&#xff0c;看似最后主角抓到了罪犯&#xf…

STM32循迹小车原理介绍和代码示例

目录 1. 循迹模块介绍 2. 循迹小车原理 3. 循迹小车核心代码 4. 循迹小车解决转弯平滑问题 1. 循迹模块介绍 TCRT5000传感器的红外发射二极管不断发射红外线当发射出的红外线没有被反射回来或被反射回来但强度不够大时红外接收管一直处于关断状态&#xff0c;此时模块的输出…

被这7款在线涂鸦画板惊艳到,手残也能画出涂鸦大片!

作为一名涂鸦爱好者或者手帐达人&#xff0c;你是否在寻找好用的在线涂鸦画板软件呢&#xff1f;涂鸦画板软件释放了创造性的无限可能&#xff0c;让你能够将想法转化为令人惊叹的视觉效果&#xff0c;并轻松地与客户、同行和全球观众分享你的作品。 在这篇文章中&#xff0c;…

Redis之 redis.config配置文件

文章目录 前言一、基本配置1.单位2.包含3.网络配置4.通用5.快照6.安全7.限制8.仅追加模式 二、总体主要介绍总结 前言 行家一出手&#xff0c;就知有没有&#xff0c;让一起学习redis.config配置文件。 一、基本配置 Redis 的配置文件位于 Redis 安装目录下&#xff0c;文件名…

android 13 write javaBean error at *** 错误

报错代码&#xff1a;红框处。 注意&#xff1a;android10 不会报错&#xff0c;运行正常。android13就报错 错误原因&#xff1a;对象中VerifyDownloadEntity&#xff0c;有个Bitmap成员变量 public class VerifyDownloadEntity {private Bitmap bitmap;private String cooki…

SpringBoot 及 配置文件

一、什么是 SpringBoot&#xff1f; Spring 是包含了众多工具的IoC容器&#xff0c;Spring Boot 是 Spring 的脚手架&#xff0c;是为了快速开发 Spring 而创建的一个框架。 二、Spring Boot 优点 快速集成框架&#xff0c;Spring Boot 提供了启动添加依赖的功能&#xff0c…

centos7安装oxidized备份软件

首先需要提前下载ruby&#xff0c;因为默认yum安装的版本太低 https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.gz 1、yum remove ruby ruby-devel&#xff08;有就卸载&#xff0c;没有则忽略&#xff09; 2、将下载好的ruby包解压到/opt下 [rootoxidized ruby-…

Cesium:CGCS2000坐标系的xyz坐标转换成WGS84坐标系的经纬高度,再转换到笛卡尔坐标系的xyz坐标

作者:CSDN @ _乐多_ 本文将介绍使用 Vue 、cesium、proj4 框架,实现将CGCS2000坐标系的xyz坐标转换成WGS84坐标系的经纬高度,再将WGS84坐标系的经纬高度转换到笛卡尔坐标系的xyz坐标的代码。并将输入和输出使用 Vue 前端框架展示了出来。代码即插即用。 网页效果如下图所示…

Boris FX Silhouette 2023.0.3(影视后期)

Silhouette mac是一种视觉表现形式&#xff0c;通常用于描绘物体或人物的轮廓。它可以通过填充与背景形成鲜明的对比&#xff0c;从而使轮廓更加清晰明了。Silhouette 是一种简约而又具有艺术感的表现方式&#xff0c;常用于绘画、摄影和设计领域。 在绘画中&#xff0c;Silho…

springboot之拦截器、servlet过滤器

一 使用maven新建Spring Boot项目 1. File --> New --> Project... --> Maven &#xff0c;如下图所示 Project SDK下拉列表框中选择前面安装的 Java1.8&#xff0c;如果下拉列表框中不存在Java 1.8&#xff0c;可以单击New按钮&#xff0c;找到安装Java的位置&…

第22期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

激光雷达标定板提高自主驾驶功能的感知精度

激光雷达&#xff08;LiDAR&#xff09;是一种通过发射激光束并测量反射回来的时间来测量目标距离和形状的传感器。为了提高激光雷达的感知精度和稳定性&#xff0c;需要进行激光雷达标定&#xff0c;以确定其激光束的准确性和稳定性。 如果没有激光雷达&#xff0c;自动驾驶的…

MW98 DM蓝牙5.2双模热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09; 软件支持&#xff08;驱动的详细使用帮助&#xff09;一些常见问题解答&#xff08;FAQ&#xff09;首次使用步骤蓝牙配对规则&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功…

transformers-Generation with LLMs

https://huggingface.co/docs/transformers/main/en/llm_tutorialhttps://huggingface.co/docs/transformers/main/en/llm_tutorial停止条件是由模型决定的&#xff0c;模型应该能够学习何时输出一个序列结束&#xff08;EOS&#xff09;标记。如果不是这种情况&#xff0c;则在…

天软特色因子看板(2023.10 第14期)

该因子看板跟踪天软特色因子A05005(近一月单笔流通金额占比(%)&#xff0c;该因子为近一个月单笔流通金额占比因子&#xff0c;用以刻画股票在收盘时&#xff0c;主力资金在总交易金额中所占的比重。 今日为该因子跟踪第14期&#xff0c;跟踪其在SW801160 (申万公用事业) 中的表…