C++设计模式---装饰器模式

news2024/11/8 7:52:46

1、介绍

        装饰器(Decorator)模式是一种结构型设计模式,它允许你动态地给一个对象添加额外的职责

        装饰器模式主要用于扩展对象的功能,而又不改变其原有结构。在C++中,装饰器模式主要应用于那些需要为对象动态添加功能或改变行为的场景,而这些附加行为是可以独立于基础组件的。

装饰器模式通常包含以下几个组件:

        (1)组件(Component):定义一个对象接口,可以给这些对象动态地添加职责。

        (2)具体组件(ConcreteComponent):实现组件接口,是被装饰器装饰的对象。

        (3)装饰器(Decorator):实现与组件相同的接口,它包含一个指向组件对象的指针(或者引用),并可以在调用组件的方法之前或之后添加一些额外的功能。

        (4)具体装饰器(ConcreteDecorator):实现装饰器接口,并添加一些额外的职责。

举例分析:

假设定义了animal接口类,并具体定义了三个具体的动物。

另外需要给每个动物增加三个功能——吃饭、睡觉、跑步;我们该如果设计类关系?

(1)为每个动物设计三个功能子类;

(2)使用装饰器,在animal下增加一个功能类;

2、示例

#include <iostream>

// 组件接口类
class animal
{
private:

public:
	virtual void show() = 0;
};

// 具体组件,子类
class cat :public animal
{
private:

public:
	void show() override
	{
		std::cout << "this is cat!" << std::endl;
	}
};

// 具体组件,子类
class dog :public animal
{
private:

public:
	void show() override
	{
		std::cout << "this is dog!" << std::endl;
	}
};

// 具体组件,子类
class sheep :public animal
{
private:

public:
	void show() override
	{
		std::cout << "this is sheep!" << std::endl;
	}
};

// 装饰器
class animal_function :public animal {
public:
	animal_function(animal* animal_ptr) :_animal_ptr(animal_ptr) {};
	void show() override {
		if (_animal_ptr != nullptr) {
			_animal_ptr->show();
		}
	}
protected:
	animal* _animal_ptr;
};

// 具体装饰器 eat
class eat_function : public animal_function {
public:
	eat_function(animal* cc) : animal_function(cc) {}

	void show() override {
		std::cout << "eat_function before" << std::endl;
		animal_function::show();
		std::cout << "eat_function after" << std::endl;
	}
};

// 具体装饰器 sleep
class sleep_function : public animal_function {
public:
	sleep_function(animal* cc) : animal_function(cc) {}

	void show() override {
		std::cout << "sleep_function before" << std::endl;
		animal_function::show();
		std::cout << "sleep_function after" << std::endl;
	}
};

// 具体装饰器 run
class run_function : public animal_function {
public:
	run_function(animal* cc) : animal_function(cc) {}

	void show() override {
		std::cout << "run_function before" << std::endl;
		animal_function::show();
		std::cout << "run_function after" << std::endl;
	}
};

int main()
{
	animal* cat_0 = new eat_function(new cat());
	cat_0->show();

	animal* dog_0 = new sleep_function(new dog());
	dog_0->show();

	animal* sheep_0 = new run_function(new sheep());
	sheep_0->show();
	return 0;
}

结果:

eat_function before
this is cat!
eat_function after
sleep_function before
this is dog!
sleep_function after
run_function before
this is sheep!
run_function after

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

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

相关文章

STM32定时器输出pwm的几种模式

目录 定时器 输出脉冲模式&#xff1a; PWM模式&#xff08;PWM Mode&#xff09; 输出比较模式&#xff08;Output Compare Mode&#xff09; 总结 占空比&#xff1a; 输出比较模式与占空比 PWM模式与占空比 输出比较模式与PWM模式的结合 输出比较模式实例&#xf…

C++ Primer Plus第五版笔记(p201-250)

第六章 函数&#xff08;下&#xff09; 在含有return语句的循环后面应该也有一条return语句 不要返回局部对象的引用或指针&#xff0c;当函数结束时临时对象占用的空间也就随之释放掉了&#xff0c;所以两条return语句都指向了不再可用的内存空间。 如果函数返回指针、引用…

甲板上的战舰|模拟?|每日一题|chatgpt结合更正

文章目录 我的天免费的4o太好用了我的天免费的4o太好用了我的天免费的4o太好用了题目详情思路&#xff1a;关键&#xff1a;chatGPT配合纠正错误思路正确代码&#xff1a; 我的天免费的4o太好用了 我的天免费的4o太好用了 我的天免费的4o太好用了 重要的事情说三遍 题目详情…

螺栓拧紧力矩标准

据德国VOITH提供Nm换算所得 螺栓扭矩表 (单位&#xff1a;Nm、Kgm) Nm0.101972mKg M6~M24螺钉或螺母的拧紧力矩操作者参考 ★对于设计图纸有明确力矩要求的;应按图纸要求执行… 套管螺母紧固力矩Q/STB B07833-1998 材料 HPb63-3Y2 直通式压注油杯 Q/STB B07020-1998螺纹M6、…

CD工具AWX之作业模板与工作流模板

一、概要 本文以php和h5项目为示例&#xff0c;讲述从初始化项目到更新发布的实现详情。 它们跟java/go等进程程序不同&#xff0c;只需要下发.php等静态文件即可&#xff0c;不涉及进程的重启。 对于php项目&#xff0c;除了php文件外&#xff0c;还包括.env配置文件。&…

【C++】STL空间配置器

STL空间配置器 一、什么是空间配置器二、为什么需要空间配置器三、SGI-STL空间配置器实现原理1、 一级空间配置器2、二级空间配置器 四、优缺点分析 一、什么是空间配置器 STL 有六大组件分别是&#xff1a;容器&#xff0c;算法&#xff0c;迭代器&#xff0c; 空间配置器&am…

【最新鸿蒙应用开发】——类Web开发范式2——前端语法

兼容JS的类Web开发范式 JS FA应用的JS模块(entry/src/main/js/module)的典型开发目录结构如下&#xff1a; 1. 项目基本结构 1.1. 目录结构 1.2. 项目文件分类如下&#xff1a; .hml结尾的HML模板文件&#xff0c;这个文件用来描述当前页面的文件布局结构。 .css结尾的CSS样…

Wall国内开源程序照片墙,支持VR全景及安装教程

下载 GitHub官网&#xff1a;https://github.com/zhang-tong-yao/wall 软件下载&#xff1a;https://github.com/zhang-tong-yao/wall/releases&#xff0c;推荐下载最新的版本。 演示效果 目前支持PC端和移动端自适应。 演示地址&#xff1a;https://demo-wall.ityao.cn …

芯片键合电阻器

引线键合电阻器&#xff08;绑定电阻器&#xff09;超稳定&#xff0c;可靠性高。激光修整至严格公差。可自定义的值和该值的唯一标记。该器件非常适合但不限于混合电路应用。与二极管芯片&#xff0c;MOS芯片&#xff0c;IGBT芯片键合封装。 芯片键合电阻器优势和特点 顶部触…

探索AOSP中的RRO:运行时资源覆盖的奥秘

探索AOSP中的RRO:运行时资源覆盖的奥秘 在Android开发中,为了提供更大的灵活性和可定制性,Android提供了一种关键特性:运行时资源覆盖(Runtime Resource Overlay,简称RRO)。本文将深入探讨RRO在Android开源项目(AOSP)中的作用及其实现方法。 什么是运行时资源覆盖(…

Vue19-key的原理

一、v-for中key的作用 给节点进行一个标识&#xff0c;类似于身份证号。 1-1、需求1&#xff1a; 点击按钮&#xff0c;在<li>的最前面添加一个老刘的信息 <body><div id"root"><h1>人员信息</h1><button click.once"add&qu…

A股上市公司长短期并购绩效CAR、BHAR数据(2008-2022年)

数据简介&#xff1a; 短期并购绩效以首次公告日前后5个交易日内持有并购方股票的累计超额回报率[CAR(-5,5)]作为短期并购绩效的衡量指标。为计算并购方的累计超额回报率&#xff0c;定义首次公告日前的150个交易日至首次公告日前的30个交易日为估计窗口期&#xff0c;以窗口期…

今日成果2024-6-7 TrustZone TEE安全SDK开发指南

Rockchip Vendor Storage Application Note.pdf OK 开机下&#xff0c;可以实现Vendor Storage的读写。 0ms时同步RTC时间 OK Rockchip_Developer_Guide_TEE_SDK_CN.pdf 什么是TrustZone 此系统方法意味着可以保护安全内存、加密块、键盘和屏幕等外设&#xff0c;从而可确…

c++中string用法详解

目录 二、案例需求 三、案例实现 1.首先获取strData中的角色数量 2.创造结构体数组&#xff0c;定义两个索引值 3.循环遍历对结构体User中的Id和Exp进行赋值 4.对结构体数组userArr进行排序 5.展示结果以及最终代码 ​四、最后 一、前言 在C中&#xff0c;std::string …

可视化剪辑,账号矩阵管理,视频分发,聚合私信多功能一体化营销工具 源代码开发部署方案

可视化剪辑&#xff0c;账号矩阵管理&#xff0c;视频分发&#xff0c;聚合私信多功能一体化营销工具 源代码开发部署方案 可视化剪辑&#xff1a; 可视化剪辑开发是一种通过图形化界面和拖放操作&#xff0c;以可视化的方式进行影片剪辑和编辑的开发方法。它可以让非专业用户…

什么是校园抄表系统?

1.校园抄表系统的简述 校园抄表系统是当代高校管理中的一个重要组成部分&#xff0c;主要运用于全自动搜集、管理方法与分析校园里的电力能源使用数据&#xff0c;如水电煤等。它通过先进的方式方法&#xff0c;完成了对能源消耗的实时监控系统&#xff0c;提升了电力能源管理…

maven基本操作和配置(idea版基础版)

写在前面&#xff1a;为一位朋友写的一个博客&#xff0c;有需要都可以查看&#xff01; 一、maven是什么&#xff1f; 一句话&#xff1a;管理依赖工具&#xff0c;统一项目结构便于开发&#xff0c;把项目开发和管理的过程抽象成对象模型来管理&#xff08;pom模型&#xf…

@JsonValue和@JsonCreator使用

当实体类中的属性为枚举类型时&#xff0c;将其序列化成json字符串传给前端&#xff0c;传递的应该是有效的值而不是枚举常量。 1. Get-Started Data public class Student {private Long id;private String userName;private String telephone;private String email;private …

C语言 | Leetcode C语言题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; void addPath(int *vec, int *vecSize, struct TreeNode *node) {int count 0;while (node ! NULL) {count;vec[(*vecSize)] node->val;node node->right;}for (int i (*vecSize) - count, j (*vecSize) - 1; i < j; i, --j)…

【C语言】12.C语言内存函数

文章目录 1.memcpy使用和模拟实现2.memmove使用和模拟实现3.memset函数的使用4.memcmp函数的使用 memcpy&#xff1a;内存拷贝 memmove&#xff1a;内存移动 memset&#xff1a;内存设置 memcmp&#xff1a;内存比较 1.memcpy使用和模拟实现 memcpy&#xff1a;内存拷贝 void…