当前位置: 首页 > news >正文

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

结果

在这里插入图片描述

相关文章:

  • 数据库的本质永远都不会改变基础语句(第二十二课)
  • Hadoop RPC简介
  • Linux根目录下的目录结构及其作用详解
  • pc通过window.open打开新页面,新页面要使用原来页面的token
  • 思腾云计算
  • 商家为什么要做霸王餐,外卖霸王餐赚钱吗?
  • QMI8658A_QMC5883L(9轴)-EVB 评估板-使用说明书
  • docker 存储目录迁移
  • 笔记软件Notability mac中文版软件功能
  • Linux入门指令和权限讲解
  • Nacos全面知识 ----微服务 SpringCloud
  • 为什么前端用vue的公司越来越多?
  • 易知微智慧医疗:用科技守护健康
  • springboot+vue基于Hadoop短视频流量数据分析与可视化系统的设计与实现【内含源码+文档+部署教程】
  • go语言学习基础(三)声明变量和数组
  • [case10]使用RSQL实现端到端的动态查询
  • [译]CSS 居中(Center)方法大合集
  • 【css3】浏览器内核及其兼容性
  • cookie和session
  • Electron入门介绍
  • emacs初体验
  • Java程序员幽默爆笑锦集
  • Java精华积累:初学者都应该搞懂的问题
  • Linux链接文件
  • Object.assign方法不能实现深复制
  • Python十分钟制作属于你自己的个性logo
  • React-flux杂记
  • Redux系列x:源码分析
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • select2 取值 遍历 设置默认值
  • socket.io+express实现聊天室的思考(三)
  • Swift 中的尾递归和蹦床
  • tweak 支持第三方库
  • webpack4 一点通
  • 闭包,sync使用细节
  • 初识 beanstalkd
  • 聊一聊前端的监控
  • 排序算法之--选择排序
  • 前端面试题总结
  • 删除表内多余的重复数据
  • 使用 QuickBI 搭建酷炫可视化分析
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 手写双向链表LinkedList的几个常用功能
  • 通过npm或yarn自动生成vue组件
  • 学习Vue.js的五个小例子
  • 与 ConTeXt MkIV 官方文档的接驳
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • zabbix3.2监控linux磁盘IO
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 大数据全解:定义、价值及挑战
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • # 数论-逆元
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #Linux(权限管理)