装饰器模式C++用法示例

news2024/11/13 11:23:22

六.装饰器模式

  • 一.装饰器模式
    • 1.原理
    • 2.适用场景
  • 二.C++程序示例
    • 1.语法组成
    • 2.C++示例

一.装饰器模式

1.原理

装饰器模式是一种结构性设计模式,其目的是通过包装对象来扩展其行为而不改变其接口。该模式可以动态地将责任附加到对象上,从而提供一种灵活的替代方法,以继承的方式静态地扩展对象的行为。

2.适用场景

装饰器模式适用于需要动态地扩展对象的行为或在不修改原始类的情况下添加新的功能的场景,如:

  1. 动态地添加、删除或修改对象的行为,而无需修改原始类的代码。
  2. 在运行时动态地为对象添加日志记录、性能测量、安全检查等行为。
  3. 为对象动态地添加新的方法或属性,而不必使用继承。
  4. 为图形用户界面添加特定的功能,例如滚动条、边框、背景颜色等。
  5. 为已有的类库添加新的行为。
  6. 需要灵活地组合多个功能时,以实现复杂的行为。
  7. 需要遵循开放/封闭原则,以便在不修改现有代码的情况下添加新的功能。

二.C++程序示例

1.语法组成

装饰器模式的语法组成包括:

  1. 抽象组件(Component):定义了原始对象和装饰器对象共同实现的接口。
  2. 具体组件(ConcreteComponent):实现了抽象组件接口,并提供了默认的行为。
  3. 抽象装饰器(Decorator):定义了具体装饰器和抽象组件共同实现的接口,并持有一个抽象组件的引用。
  4. 具体装饰器(ConcreteDecorator):实现了抽象装饰器接口,并持有一个抽象组件的引用,从而可以动态地为抽象组件添加新的行为。

在使用装饰器模式时,首先需要定义一个抽象组件接口,以及一个或多个具体组件类来实现该接口。然后定义一个抽象装饰器接口,并为每个需要添加新行为的具体组件类创建一个具体装饰器类。具体装饰器类可以通过在抽象组件上包装其他对象来实现新的行为。最后,可以通过将具体组件对象传递给具体装饰器对象,动态地添加新行为。

2.C++示例

#include <iostream>
using namespace std;

// 抽象组件
class Component {
public:
    virtual void operation() = 0;
};

// 具体组件
class ConcreteComponent : public Component {
public:
    void operation() override {
        cout << "ConcreteComponent operation." << endl;
    }
};

// 抽象装饰器
class Decorator : public Component {
protected:
    Component* component;

public:
    Decorator(Component* component) : component(component) {}
    void operation() override {
        if (component) {
            component->operation();
        }
    }
};

// 具体装饰器A
class ConcreteDecoratorA : public Decorator {
public:
    ConcreteDecoratorA(Component* component) : Decorator(component) {}
    void operation() override {
        Decorator::operation();
        addBehaviorA();
    }

    void addBehaviorA() {
        cout << "ConcreteDecoratorA addBehaviorA." << endl;
    }
};

// 具体装饰器B
class ConcreteDecoratorB : public Decorator {
public:
    ConcreteDecoratorB(Component* component) : Decorator(component) {}
    void operation() override {
        Decorator::operation();
        addBehaviorB();
    }

    void addBehaviorB() {
        cout << "ConcreteDecoratorB addBehaviorB." << endl;
    }
};

int main() {
    Component* component = new ConcreteComponent();
    component = new ConcreteDecoratorA(component);
    component = new ConcreteDecoratorB(component);
    component->operation();
    delete component;
    return 0;
}

这个示例包含一个抽象组件类Component、一个具体组件类ConcreteComponent和两个具体装饰器类ConcreteDecoratorA和ConcreteDecoratorB

在main函数中,我们首先创建一个ConcreteComponent对象,然后用ConcreteDecoratorA和ConcreteDecoratorB装饰它,最后调用operation方法以观察输出结果。输出结果如下:

在这里插入图片描述

可以看到,具体组件的默认行为在两个具体装饰器的新行为之前被执行,而两个具体装饰器的新行为则按顺序被执行。

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

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

相关文章

SQL Server基础 第三章 数据表基本操作(增删改查,不允许保存更改异常!)

往表里插数据我们现在有两种方式第一种是编辑直接修改&#xff0c;第二种是通过查询来修改数据 两种方法的区别 第一种更直接&#xff0c;如果数据量小那么直接改就好了&#xff0c;那如果数据量稍微庞大我们就需要用新建查询来进行表内容的修改了&#xff01;&#xff01;&a…

【Linux】进程信号 --- 信号的产生 保存 捕捉递达

被爱情困住的是傻子 文章目录 一、信号的预备知识1.通过生活例子来理解信号2.迁移到进程上来理解信号 二、信号的发送&#xff08;修改PCB的信号位图&#xff09;1.通过键盘发送信号&#xff08;kill指令 和 热键&#xff09;2.通过系统调用发送信号&#xff08;kill系统调用 和…

前端技术的miniui 和bootstartp

前端技术的miniui 和bootstartp 目录概述需求&#xff1a; 设计思路实现思路分析1.前端技术boostatrp2.miniui: 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better re…

1686_MATLAB处理Excel文件

全部学习汇总&#xff1a; GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes servral …

opencv交叉编译,支持ffmpeg、libjpeg,实现取流及写入jpeg文件

一、准备工作 1、虚拟机交叉编译连 2、在虚拟机目录下创建工作目录&#xff0c;注意不要选择windows共享目录&#xff0c;比如这里选择&#xff1a; /home/cxyazhou/work 3、虚拟机安装cmake cmake-gui pkg-config&#xff0c;直接apt install即可 4、源码下载&#xff0c;需要…

Mongodb的部署

MongoDB下载包获取 https://www.mongodb.com/try/download/community 安装配置 第一步&#xff1a;在服务器 /usr/local 下创建 MongoDB 文件夹&#xff0c;用来存放安装包、服务以及之后 MongoDB 的数据库和日志文件。 cd /usr/local // 进入安装目录 mkdir MongoDB // 创…

【LeetCode: 2369. 检查数组是否存在有效划分 | 暴力递归=>记忆化搜索=>动态规划 | 线性dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

OpenCV(14)-OpenCV4.0中文文档学习2(补充)

相机校准和3D重建 相机校准 标定 findChessboardCorners() 它返回角点和阈值&#xff0c;如果成功找到所有角点&#xff0c;则返回 True。这些角落将按顺序放置&#xff08;从左到右&#xff0c;从上到下&#xff09;cornerSubPix()用以寻找图案&#xff0c;找到角点后也可以…

PHREEQC实践建模技术方法

PHREEQC软件为美国地质调查局基于C和C语言开发&#xff0c;面向一般地球化学、水文地球化学模拟的专业软件。该软件历经近30年迭代&#xff0c;功能不断完善&#xff0c;目前已发展成为-以PHREEQC为计算核心&#xff08;更新至3.7版本&#xff09;&#xff0c;辅以具备二次开发…

【无标题】docker安装jenkins安装流程(二)

配置Publish Over SSH JENKINS_URL/job/goods/build?tokenTOKEN_NAME http://xxxxx:8001/job/goods/job/goods/build?tokenxql1232.提交合并代码触发自动构建 http://xxxxx:8001/buildByToken/build?jobgoods&tokenxql123http://xxxxx:8001/buildByToken/build?jobgood…

Javaee 基于注解的AOP开发

基于注解的 aop 开发步骤&#xff1a; 1. 创建目标接口和目标类&#xff08;内部有切点&#xff09; 2. 创建切面类&#xff08;内部有增强方法&#xff09; 3. 将目标类和切面类的对象创建权交给 spring 4. 在切面类中使用注解配置织入关系 5. 在配置文件中开启组件…

gpt写文章批量写文章-gpt3中文生成教程

怎么用gpt写文章批量写文章 批量写作文章是很多网站、营销人员、编辑等需要的重要任务&#xff0c;GPT可以帮助您快速生成大量自然、通顺的文章。下面是一个简单的步骤介绍&#xff0c;告诉您如何使用GPT批量写作文章。 步骤1&#xff1a;选择好训练模型 首先&#xff0c;选…

14、RPC与gRPC

目录 一、rpc基础1 - rpc入门2 - 基础的rpc通信3 - 基于接口的RPC服务 二、rpc编码1 - gob编码2 - json on tcp3 - json on http&#xff08;待补充&#xff09; 三、prtotobuf编码1 - prtotobuf概述2 - protobuf编译器3 - 序列化和反序列化4 - 基于protobuf的RPC&#xff08;待…

TiDB实战篇-TiCDC

目录 简介 原理 使用场景 使用限制 硬件配置 部署 在安装TiDB的时候部署 扩容部署 操作 管理CDC 管理工具 查看状态 创建同步任务 公共参数 CDC任务同步到MySQL实战 同步命令 查看所有的同步任务 同步任务的状态 管理同步任务 查看一个同步信息的具体情况 …

腾讯云COS+ElmentUI+SpringBoot视频上传功能实现

文章目录 第一步&#xff1a;选择合适的组件并整合到项目中第二步&#xff1a;前端校验第三步&#xff1a;绑定上传成功方法第四步&#xff1a;腾讯云cos后端接口配置 今天在做项目的时候需要完成一个视频上传的功能&#xff0c;这里做一个记录&#xff01; 第一步&#xff1a;…

春秋云境:CVE-2022-25411(Maxsite CMS文件上传漏洞)

目录 一、题目 二、官方POC 一、题目 介绍&#xff1a; MaxSite CMS是俄国MaxSite CMS开源项目的一款网站内容管理系统 Maxsite CMS存在文件上传漏洞&#xff0c;攻击者可利用该漏洞通过精心制作的PHP文件执行任意代码。 进入题目&#xff1a; 发现是俄文 乌拉~~ 不过没…

MongoDB副本集

一、介绍 MongoDB副本集(Replica set)是一组MongoDB实例,它们都维护着相同的数据集合。MongoDB副本集是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。副本集没有固定的主节点,当主节点发生故障时整个集群会选举一个主节点为系统提供服务…

6.S081——Lab3——page table

0.briefly speaking 这是6.S081 Fall 2021的第三个实验&#xff0c;是页表和虚拟内存相关的实验&#xff0c;在之前我们已经详细地阅读了Xv6内核中有关虚拟内存管理的源代码&#xff0c;现在就可以深入一下这个实验了。本实验分为如下三个小任务&#xff1a; Speed up system…

【Mac-m2芯片docker安装AWVS及问题解决】

【Mac-m2芯片docker安装AWVS及问题解决】 docker安装AWVS安装报错问题解决 docker安装 docker安装命令&#xff1a; brew install --cask --appdir/Applications docker 查看是否安装成功&#xff1a; docker --version docker info 换源&#xff1a; “https://hub-mirror.c.…

在Python中使用牛顿法

牛顿法简介 牛顿法&#xff08;Newton’s method&#xff09;是一种常用的优化算法&#xff0c;在机器学习中被广泛应用于求解函数的最小值。其基本思想是利用二次泰勒展开将目标函数近似为一个二次函数&#xff0c;并用该二次函数来指导搜索方向和步长的选择。 牛顿法需要计…