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;// 装饰一下hahapHablee = new DecratedHaHaPerson(pHablee);std::cout << "装饰了haha的hablee的show" << std::endl;pHablee->show();std::cout << std::endl;// 再装饰一个wawapHablee = new DecratedWaWaPerson(pHablee);std::cout << "装饰了haha和wawa的hablee的show" << std::endl;pHablee->show();std::cout << std::endl;delete pHablee;return 0;
}

结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IS200EPSMG1AED 使用Lua创建逻辑脚本或完整程序

IS200EPSMG1AED 使用Lua创建逻辑脚本或完整程序 IS200EPSMG1AED 是一种支持网络的I/O控制器&#xff0c;它执行类似于可编程逻辑控制器(PLC)的控制、逻辑和监控功能。然而&#xff0c;与PLC不同&#xff0c;X-600M是为基于网络的应用而设计的。X-600M可以使用内置网络服务器和…

【256MB+256MB】起,含税低至88元!飞凌嵌入式FET113i-S全国产核心板上市

超低价、超灵活、超全能&#xff01;飞凌嵌入式FET113i-S全国产核心板正式发布&#xff01;整板采用100%国产工业级元器件&#xff0c;含税价最低仅需88元&#xff01; FET113i-S核心板基于全志T113-i工业级处理器开发设计&#xff0c;主频1.2GHz&#xff0c;配备多核多架构&a…

如何开始开发一个跑腿App系统?

1. 确定需求和功能规划 开始开发之前&#xff0c;需明确系统所需的基本功能&#xff0c;包括用户注册、登录、下单、配送员匹配、订单跟踪等。这些功能需要在系统设计之初明确。 2. 技术选型 选择适合的技术栈。前端可以使用框架如React、Vue.js&#xff0c;后端可选择Node…

智慧财务的未来

信息化时代&#xff0c;财务管理不再局限于传统的手工操作&#xff0c;而是借助RPA技术实现了自动化、智能化的转型。智慧财务作为财务管理的一种新模式&#xff0c;将为企业提供更加高效、便捷的服务&#xff0c;使企业能够更好地适应市场需求的变化&#xff0c;在瞬息万变的市…

史上最详细注释,用flask写一个博客系统

文本用flask写个博客系统&#xff0c;源码带有详细注释&#xff0c;通俗易懂&#xff0c;拿去就能用。博客效果如下&#xff0c;博客首页&#xff1a; 这个博客麻雀虽小&#xff0c;但五脏俱全。有如下功能&#xff1a; 博客文章浏览用户注册用户登录/登出发文章/修改文章/删除…

vue:js中合并对象的方法

目前比较常用的一共有三种 1、使用object.assign() 它可以将一个或多个对象的属性复制到目标对象中&#xff0c;第一个参数就是目标对象&#xff0c;这里举个例子&#xff1a; <template><div>{{data}}</div> </template> <script> export de…

陪诊接单系统|陪诊系统助力您获取更好的服务

为了解决陪诊过程中的种种瓶颈和问题&#xff0c;我们开发了一款创新的陪诊接单系统&#xff0c;旨在为客户提供更加高效、专业的陪诊服务。该系统凭借其独特的功能和特点&#xff0c;助力您获取更好的陪诊服务体验。 陪诊系统功能&#xff1a; 1、诊前约号&#xff1a;人工带…

MySql优化经验分享

一条sql的具体执行过程 连接 我们怎么查看MySQL当前有多少个连接&#xff1f; 可以用show status命令&#xff0c;模糊匹配Thread&#xff0c; Show global status like "Thread%" show global variables like wait timeout;—非交互式超时时间&#xff0c;如JDBC…

【数据结构】树家族

目录 树的相关术语树家族二叉树霍夫曼树二叉查找树 BST平衡二叉树 AVL红黑树伸展树替罪羊树 B树B树B* 树 当谈到数据结构中的树时&#xff0c;我们通常指的是一种分层的数据结构&#xff0c;它由节点&#xff08;nodes&#xff09;组成&#xff0c;这些节点之间以边&#xff08…

记一次大数据事故@用了很久的虚拟机环境突然不能联网了

记一次大数据事故用了很久的虚拟机环境突然不能联网了 背景 今天打开自己电脑上的虚拟机环境打算练习一下flink&#xff0c;结果发现vmware里虚拟机能正常开机&#xff0c;也能正常进图os&#xff0c;但是就是不能ping通主机&#xff0c;主机也不能ping通虚拟机 探查 1、…

@Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成

问题 Tag和Operation标签失效 但是Schema标签有效 pom依赖 <!-- 接口文档--><!--引入openapi支持--><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><vers…

c语言练习(9周)(16~20)

输入12个一位整数&#xff0c;创建二维数组a[3][4]&#xff0c;显示二维数组及各列的平均值&#xff0c;平均值四舍五入到小数点后一位。 题干输入12个一位整数&#xff0c;创建二维数组a[3][4]&#xff0c;显示二维数组及各列的平均值&#xff0c;平均值四舍五入到小数点后一…

RIP路由配置

RIP路由配置步骤与命令&#xff1a; 1.启用RIP路由&#xff1a;router rip 2.通告直连网络&#xff1a;network 直连网络 3.启用RIPv2版本&#xff1a;version 2 4.禁用自动汇总&#xff1a;no auto-summary 注意&#xff1a;静态路由通告远程网络&#xff0c;动态路由通告…

Web - Servlet详解

目录 前言 一 . Servlet简介 1.1 动态资源和静态资源 1.2 Servlet简介 二 . Servlet开发流程 2.1 目标 2.2 开发过程 三 . Servlet注解方式配置 ​编辑 四 . servlet生命周期 4.1 生命周期简介 4.2 生命周期测试 4.3 生命周期总结 五 . servlet继承结构 5.1 ser…

Pytorch 注意力机制解析与代码实现

目录 什么是注意力机制1、SENet的实现2、CBAM的实现3、ECA的实现4、CA的实现 什么是注意力机制 注意力机制是深度学习常用的一个小技巧&#xff0c;它有多种多样的实现形式&#xff0c;尽管实现方式多样&#xff0c;但是每一种注意力机制的实现的核心都是类似的&#xff0c;就…

【Kubernetes部署】二进制部署单Master Kurbernetes集群 超详细

二进制部署K8s 一、基本架构和系统初始化操作1.1 基本架构1.2 系统初始化操作 二、部署etcd集群2.1 证书签发Step1 下载证书制作工具Step2 创建k8s工作目录Step3 编写脚本并添加执行权限Step4 生成CA证书、etcd 服务器证书以及私钥 2.2 启动etcd服务Step1 上传并解压代码包Step…

面试算法51:节点值之和最大的路径

题目 在二叉树中将路径定义为顺着节点之间的连接从任意一个节点开始到达任意一个节点所经过的所有节点。路径中至少包含一个节点&#xff0c;不一定经过二叉树的根节点&#xff0c;也不一定经过叶节点。给定非空的一棵二叉树&#xff0c;请求出二叉树所有路径上节点值之和的最…

分体式离子风刀和整体式离子风刀分别有哪些优缺点

离子风刀是一种利用高速旋转的离子风扇产生的离子风来清洁和干燥物体表面的设备。根据离子风扇的安装方式&#xff0c;离子风刀可以分为分体式离子风刀和整体式离子风刀。下面是它们各自的优缺点&#xff1a; 分体式离子风刀的优点&#xff1a; 安装方便&#xff1a;分体式离子…

电压放大器可用于什么场合

电压放大器是电子器件中常见的一种放大器类型&#xff0c;它可以将输入信号的电压放大到更大的幅度&#xff0c;以满足特定应用的需求。电压放大器广泛应用于多个领域和场合&#xff0c;下面将详细介绍一些使用电压放大器的场景。 音频放大器&#xff1a;音频放大器是电压放大器…

(1)(1.11) LeddarTech Leddar One

文章目录 前言 1 连接到自动驾驶仪 2 参数说明 前言 Leddar One 激光雷达(Leddar One Lidar)是一款重量轻、价格合理的激光雷达&#xff0c;测距 40m&#xff0c;更新频率 70hz&#xff0c;光束为 3 度漫射。有关详细信息&#xff0c;请参阅数据表(datasheet)。 &#xff0…