C++设计模式-装饰器(Decorator)

news2024/11/19 7:29:37

目录

C++设计模式-装饰器(Decorator)

一、意图

二、适用性

三、结构

四、参与者

五、代码


C++设计模式-装饰器(Decorator)

一、意图

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

二、适用性

  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  • 处理那些可以撤消的职责。
  • 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

三、结构

 

四、参与者

  • Component

        定义一个对象接口,可以给这些对象动态地添加职责。

  • ConcreteDecorator

       定义一个对象,可以给这个对象添加一些职责。

  • Decorator

        维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。

  • ConcreteComponent

        向组件添加职责。

五、代码

#include<iostream>
using namespace std;

class Component {
public:
	virtual void Operation() = 0;
};

class ConcreteComponent : public Component{
public:
	virtual void Operation() {
		cout << "ConcreteComponent" << endl;
	}
};

class Decorator : public Component {
public:
	Decorator(Component* tempComponent) :component(tempComponent) {}
	virtual void Operation() {
		component->Operation();
	}
private:
	Component* component;
};

class ConcreteDecoratorA : public Decorator {
public:
	ConcreteDecoratorA(Component* tempComponent) :Decorator(tempComponent) {}
	virtual void Operation() {
		Decorator::Operation();
		cout << "ConcreteDecoratorA" << endl;
	}
};

class ConcreteDecoratorB : public Decorator {
public:
	ConcreteDecoratorB(Component* tempComponent) :Decorator(tempComponent) {}
	virtual void Operation() {
		Decorator::Operation();
		cout << "ConcreteDecoratorB" << endl;
	}
};

int main() {
	Component* component = new ConcreteComponent;
	component->Operation();

	Component* componentA = new ConcreteDecoratorA(component);
	componentA->Operation();

	Component* componentB = new ConcreteDecoratorB(component);
	componentB->Operation();

	return 0;
}

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

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

相关文章

【推荐系统】wss课程-重排序

MMR marginal 边缘的&#xff1b; i已选中&#xff0c;j 未选中。注意&#xff01;j 是很多物品。 每一轮的 S 都会发生变化&#xff0c;所以每轮的 MRi都要重新计算。 - 每轮都从未选中的物品中与已选中的物品计算 MR&#xff0c;把分数最高的 i 从 R 中移出来。 目标&am…

Uvc Usb Camera 调节亮度无效问题,搞定

Uvc Usb Camera无法正常调节亮度的问题&#xff0c;搁置了也有好长一段时间了。假期期间&#xff0c;下定决心要排查下&#xff0c;搞定才行。 然后折腾了下&#xff0c;跟踪了下代码流程&#xff0c;添加了些日志,debug了下。 最后发现在下图位置&#xff0c;有个判断条件&…

基于SpringBoot的民宿在线预定平台

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 民宿信息管理 民宿资讯管理 民宿分类管理 用户注册 民宿信息 我的订单 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实…

C# 图解教程 第5版 —— 第1章 C# 和 .NET 框架

文章目录 1.1 在 .NET 之前1.2 .NET 时代1.2.1 .NET 框架的组成1.2.2 大大改进的编程环境 1.3 编译成 CIL1.4 编译成本机代码并执行1.5 CLR1.6 CLI1.7 各种缩写1.8 C# 的演化1.9 C# 和 Windows 的演化&#xff08;*&#xff09; 1.1 在 .NET 之前 MFC&#xff08;Microsoft Fou…

Golang网络编程:即时通讯系统Instance Messaging System

系统基本架构 版本迭代 项目改造 无人机是client&#xff0c;我们是server&#xff0c;提供注册登入&#xff0c;场景选择等。信道模拟器是server&#xff0c;我们是client&#xff0c;我们向信道模拟器发送数据&#xff0c;等待信道模拟器计算结果&#xff0c;返回给无人机。…

算法-动态规划-最长递增子序列

算法-动态规划-最长递增子序列 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/longest-increasing-subsequence/ 1.2 题目描述 2 动态规划 2.1 思路 思考如果以dp[i]表示i位置的字符的最长递增子序列长度&#xff0c;那么很难找到dp[i]和dp[i-1]的关系&#xff…

【redis学习笔记】缓存

redis主要的三个应用场景 存储数据缓存消息队列&#xff08;redis本来是设计用来作为消息队列的&#xff09; redis常用作mysql的缓存 因为MySQL等数据库&#xff0c;效率比较低&#xff0c;所以承担的并发量就有限。一旦请求数量多了&#xff0c;数据库的压力就会很大&#…

Ubuntu 20.04源码安装sysbench 1.0.20,源码安装sysstat v12.7.2

源码安装sysbench 1.0.20 参考的博客&#xff1a;《压测数据库1&#xff1a; Ubuntu 20 安装sysbench1.0.20》 sudo apt install -y automake libtool pkg-config下载依赖包&#xff0c;需要注意的是我这台计算机已经安装过mysql&#xff0c;所以我没有安装libmysqlclient-de…

GitLab平台安装中经典安装语句含义解析

yum -y install policycoreutils openssh-server openssh-clients postfix 这是一个Linux命令&#xff0c;用于使用YUM包管理器安装指定的软件包。下面是对这个命令各部分的解释&#xff1a; yum&#xff1a;这是一个Linux命令行工具&#xff0c;用于管理RPM&#xff08;Red …

代码随想录第36天 | 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 第一想法 /*** param {number[]} stones* return {number}*/ var lastStoneWeightII function (nums) {// 和分割两个和相等的子数组一样//dp[j]表示 背包总容量&#xff08;所能装的总重量&#xff09;是j&#xff0c;放进物品后&#xff0c;背的…

JetBrains ToolBox修改应用安装位置

TooBox修改应用安装位置 1.关闭ToolBox 2.修改配置文件 找到配置文件所在位置 C:\Users\用户名\AppData\Local\JetBrains\Toolbox\.settings.json增加install_location字段 "install_location": "E:\\DevTool\\IDE",E:\DevTool\IDE可以改成自己想要的…

为什么MySQL索引选择B+树而不使用B树?

为什么mysql索引选择B树而不使用B树&#xff1f; 1. 关于mysql查询效率&#xff1a; 2. 关于分块读取&#xff1a; 3. 关于数据格式存储&#xff1a; 4. 关于合适的数据结构&#xff1a;哈希表&#xff0c;树 哈希表: 分析&#xff1a; 哈希表是散列表&#xff0c;存储在其中的…

基于腾讯云的OTA远程升级

一、OTA OTA即over the air,是一种远程固件升级技术&#xff0c;它允许在设备已经部署在现场运行时通过网络远程更新其固件或软件。OTA技术有许多优点&#xff0c;比如我们手机系统有个地方做了优化&#xff0c;使用OTA技术我们就不用召回每部手机&#xff0c;直接通过云端就可…

vim操作教程,看这一篇绝对足够啦~

简介 vi 是一种命令行的文本编辑器&#xff0c;vim 是进阶版的 vi&#xff0c;gvim是vim的图形化版本。 Vim有几种基本的工作模式&#xff1a; 一般模式&#xff08;Normal Mode, 命令模式&#xff0c;普通模式&#xff09; 一般模式是vim默认的模式&#xff0c;当打开一个…

基于springboot的论坛网站

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 普通管理员管理 交流论坛 交流论坛评论 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了…

前端项目nginx部署

进入nginx下载地址:https://nginx.org/ 下载完安装包以后,解压在D盘中 双击进去> 将前端打包好的文件放在nginx的html文件夹中 可能80端口会被系统所占用 我们可以在nginx的conf文件夹中的nginx.conf文件中修改80为90 之后我们就可以在任务管理器中看到了 然后 localhost:…

C++入门-day02

引言&#xff1a;在上一节中我们接触了C中的命名空间&#xff0c;学会了C中的标准输出流。这一节&#xff0c;我标题一们讲讲缺省、重载。 一、缺省参数 在C中&#xff0c;给函数的形参默认给一个值就是缺省参数&#xff0c;你可能会比较懵逼&#xff0c;下面看一段代码。 正常…

Prompt-Tuning(一)

一、预训练语言模型的发展过程 第一阶段的模型主要是基于自监督学习的训练目标&#xff0c;其中常见的目标包括掩码语言模型&#xff08;MLM&#xff09;和下一句预测&#xff08;NSP&#xff09;。这些模型采用了Transformer架构&#xff0c;并遵循了Pre-training和Fine-tuni…

项目规划得心应手:Plane 助你打造高效能团队 | 开源日报 No.48

streamlit/streamlit Stars: 27.5k License: Apache-2.0 Streamlit 是一个快速构建和共享数据应用程序的方法。它可以将数据脚本转换为可分享的 Web 应用&#xff0c;只需几分钟即可完成。该项目完全由 Python 编写&#xff0c;开源且免费&#xff01;一旦创建了一个应用程序&…

用IDEA操作数据库--MySQL

IDEA集成了DataGrip的操作数据库的功能 就可以省略我们下载SQLyog/Navicat/DataGrip这些图形化操作工具了 以下是IDEA的使用 输入数据库的用户和密码