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

目录

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.hqwc.cn/news/127268.html

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

相关文章

嵌入式养成计划-35------C++绪论------C++数据类型------array容器------命名空间

七十三、 工具QT 73.1 安装步骤 73.2 什么是 Qt Qt 是一个跨平台的 C图形用户界面应用程序框架。 它为应用程序开发者提供建立艺术级图形界面所需的所有功能。 它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 73.3 Qt 的优点 跨平台&…

Vue中如何进行分布式日志收集与日志分析(如ELK Stack)

在Vue中实现分布式日志收集与日志分析&#xff08;使用ELK Stack&#xff09; 日志收集和分析在现代应用程序中是至关重要的&#xff0c;它们可以帮助开发人员监视和诊断应用程序的行为&#xff0c;从而提高应用程序的稳定性和性能。ELK Stack&#xff08;Elasticsearch、Logs…

UG\NX二次开发 特征选择对话框 UF_UI_select_feature

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 qq_42007619 订阅本专栏,非常感谢。 简介: UG\NX二次开发 特征选择对话框 UF_UI_select_feature 效果: 代码: #include <vector>…

竞赛选题 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

漏洞复现-易思无人值守智能物流文件上传

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

Puppeteer基础知识(一)

Puppeteer基础知识&#xff08;一&#xff09; Puppeteer基础知识&#xff08;一&#xff09;一、简介二、其他一些自动化测试工具三、安装与使用四、Puppeteer常用命令五、常见问题解决&#xff1a; 一、简介 Puppeteer 是一个强大而灵活的工具&#xff0c;可以用于网页爬虫、…

黑马JVM总结(二十七)

&#xff08;1&#xff09;synchronized代码块 synchronized代码块的底层原理&#xff0c;它是给一个对象进行一个加锁操作&#xff0c;它是如何保证如果你出现了synchronized代码块中出现了问题&#xff0c;它需要给这个对象有一个正确的解锁操作呢&#xff0c;加锁解锁是成对…

【用unity实现100个游戏之14】Unity2d做一个建造与防御类rts游戏

前言 欢迎来到本次教程&#xff0c;我将为您讲解如何使用 Unity 引擎来开发一个建造与防御类 RTS&#xff08;即实时战略&#xff09;游戏。 在本教程中&#xff0c;我们将学习如何创建 2D 场景、设计 2D 精灵、制作 2D 动画、响应用户输入、管理游戏数据、以及其他有关游戏开…

进程间通信-信号概述

一、信号的概念 信号是一种进程间通信的机制&#xff0c;用于在软件层面上对异步事件进行通知。信号通常是由操作系统或其他进程发送给目标进程的一种通知&#xff0c;以指示发生了某种事件或条件。这样的事件可能包括硬件异常、用户输入、定时器到期、子进程状态变化等。 引发…

C++笔记之信号量、互斥量与PV操作

C笔记之信号量、互斥量与PV操作 文章目录 C笔记之信号量、互斥量与PV操作1.信号量概念2.信号量例程一3.信号量例程二4.信号量例程三5.互斥量6.PV操作概念7.PV操作详解——抄自&#xff1a;https://mp.weixin.qq.com/s/vvjhbzsWQNRkU7-b_dURlQ8.PV操作的英文全称 1.信号量概念 …

【一、灵犀考试系统项目设计、框架搭建】

一、创建数据库 1、打开power designer&#xff0c;新建数据库模型 2、新建数据表&#xff0c;以及关系 【注意】 图片的类型有两种&#xff1a;varbinary 和 image varbinary : 二进制字节流&#xff0c;可以自动控制长度 image : 最大可放2G图片 3、创建数据库&#…

FastThreadLocal 快在哪里 ?

FastThreadLocal 快在哪里 &#xff1f; 引言FastThreadLocalset如何获取当前线程私有的InternalThreadLocalMap &#xff1f;如何知道当前线程使用到了哪些FastThreadLocal实例 ? get垃圾回收 小结 引言 FastThreadLocal 是 Netty 中造的一个轮子&#xff0c;那么为什么放着…