设计模式-装饰器

        装饰器模式是一种结构型设计模式,它允许在运行时扩展一个对象的功能,而不需要改变其现有结构。这种模式的核心思想是通过创建一个装饰器来动态地增强或修改原有对象的行为。装饰器模式是继承的一个补充,提供了比继承更加灵活的方式来扩展对象的行为。

一、编码

  1、头文件

#ifndef _DECORATE_H__
#define  _DECORATE_H__
#include <iostream>
using namespace  std;
/// 抽象被装饰者
// template<class T,class U>  class Decoratee {
//     public:
//         virtual  U  execOpt(T t) = 0 ;
// };// template<class T,class U> class DecorateImpl: public Decoratee {
//      public:
//          U  execOpt(T t);
// };/// 抽象被装饰者
class  Decoratee{public:int  value;virtual  void  decorateeOpt() = 0 ;
};/// 被装饰者的具体实现
class DecorateeImpl : public Decoratee{public: DecorateeImpl();void  decorateeOpt() override;
};/// 定义装饰器接口
class  Decorator : public Decoratee {protected:Decoratee* decoratee;public:/// @brief  装饰器增强方法virtual  void  decoratorOpt() = 0;
};/// 扩展装饰器A
class  DecoratorImplA : public Decorator {public:DecoratorImplA(Decoratee* decoratee);void  decorateeOpt() override;  void  decoratorOpt() override;
};/// 扩展装饰器B
class  DecoratorImplB : public Decorator {public:DecoratorImplB(Decoratee* decoratee);void  decorateeOpt() override;  void  decoratorOpt() override;
};#endif

 2、函数定义

#include "decorate.h"// template<class T,class U>
// U  DecorateImpl<T,U>::execOpt(T t) {
//     cout << "" << endl;
// }DecorateeImpl::DecorateeImpl(){this->value = 1;
}void  DecorateeImpl::decorateeOpt(){this->value = this->value + 2; cout << "DecorateeImpl  execOpt  value = " << this->value << endl;
}DecoratorImplA::DecoratorImplA(Decoratee* decoratee) {this->decoratee = decoratee ;
}void  DecoratorImplA::decorateeOpt(){if(this->decoratee== nullptr){return;}this->decoratee->decorateeOpt();this->decoratorOpt();
}void  DecoratorImplA::decoratorOpt(){this->decoratee->value =  this->decoratee->value * 5;cout << "DecoratorImplA  execOpt  value = " <<  this->decoratee->value << endl;
}DecoratorImplB::DecoratorImplB(Decoratee* decoratee) {this->decoratee = decoratee ;
}void  DecoratorImplB::decorateeOpt(){if(this->decoratee== nullptr){return;}this->decoratee->decorateeOpt();DecoratorImplB::decoratorOpt();
}void  DecoratorImplB::decoratorOpt(){this->decoratee->value =  this->decoratee->value * 10;cout << "DecoratorImplB  execOpt  value = " <<  this->decoratee->value << endl;
}

二、测试

Decoratee*  decoratee = new DecorateeImpl();
Decorator*  decoratorA = new DecoratorImplA(decoratee);
Decorator*  decoratorB = new DecoratorImplA(decoratee);
decoratorA->decorateeOpt();
decoratorB->decorateeOpt();

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

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

相关文章

在线JSON可视化工具--改进

先前发布了JSON格式化可视化在线工具&#xff0c;提供图形化界面显示结构关系功能&#xff0c;并提供JSON快速格式化、JSON压缩、快捷复制、下载导出、对存在语法错误的地方能明确显示&#xff0c;而且还支持全屏&#xff0c;极大扩大视野区域。 在线JSON格式化可视化工具 但…

Cannot load configuration class: com.xxx.NacosConfigApplication

Cannot load configuration class: com.xxx.NacosConfigApplication 无法启动成功 表象错误的日志信息解决方案结言 表象 最简单的Spring Boot maven 配置 properties配置 启动类&#xff0c;但是&#xff0c;就是无法启动成功。 错误的日志信息 java.lang.IllegalStateEx…

Java面试题系列 - 第1天

题目&#xff1a;解释Java中的垃圾回收机制&#xff08;GC&#xff09;并描述至少两种不同的垃圾回收算法。 背景说明&#xff1a;Java的垃圾回收机制是其自动内存管理的关键特性之一&#xff0c;它自动追踪并回收不再使用的对象所占用的内存空间&#xff0c;从而避免了手动管…

硅纪元AI应用推荐 | 国产创作引擎即梦AI助力创作者探索创作新境界

“硅纪元AI应用推荐”栏目&#xff0c;为您精选最新、最实用的人工智能应用&#xff0c;无论您是AI发烧友还是新手&#xff0c;都能在这里找到提升生活和工作的利器。与我们一起探索AI的无限可能&#xff0c;开启智慧新时代&#xff01; 在人工智能快速发展的今天&#xff0c;各…

怎么还有人分不清路由器、交换机、光猫、WiFi……你真的都了解吗?

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 讲某个具体技术&#xff0c;说不定你头头是道&#xff0c;但关于路由器、交换机、光猫、WiFi的知识细节&…

自然语言处理领域介绍及其发展历史

自然语言处理领域介绍及其发展历史 1 NLP2 主要任务3 主要的方法1 基于规则的方法&#xff08;1950-1980&#xff09;2 基于统计的方法&#xff08;传统的机器学习的方法&#xff09;3 Connectionist approach&#xff08;Neural networks&#xff09; 1 NLP 自动的理解人类语…

新能源组合灶,一灶两用(电燃灶+电陶炉),电生明火,无需燃料

在科技日新月异的今天&#xff0c;厨房电器的创新不断为我们的生活带来便捷与惊喜。华火新能源电燃灶&#xff0c;以其独特的设计和卓越的性能&#xff0c;成为未来厨房的首选&#xff0c;为您打造全新的烹饪体验。 中国人的烹饪文化源远流长&#xff0c;讲究火候的掌控和明火烹…

Android系统system.exit(10);里面10代表的涵义,以及其他可以赋值数字可以是多少?

在Android系统中&#xff0c;System.exit(int status) 方法是Java语言提供的&#xff0c;用于终止当前正在运行的Java虚拟机&#xff08;JVM&#xff09;。在Android应用开发中&#xff0c;这个方法的使用并不常见&#xff0c;也不推荐&#xff0c;因为Android应用通常是通过其…

PHP电商系统开发指南高级技巧

开发高级 php 电商系统所需的技巧包括&#xff1a;数据库优化&#xff1a;使用索引、规范化数据结构和缓存机制。性能优化&#xff1a;启用页面缓存、优化图像和使用 cdn。购物车管理&#xff1a;使用会话或数据库存储数据&#xff0c;实现实时更新和弃单恢复。支付集成&#x…

[vue3+js]实现3d旋转效果

1. 实现效果图&#xff1a; 2.实现代码&#xff1a; css: <style lang"scss" scoped>.bottomContainer{width: 1200px;height: 400px;display: flex;justify-content: center;position: relative;margin:200px auto;align-items: center;// background-image…

既美观又方便的后台框架谁需要?进来就对了。

一套既美观又方便的后台框架可以大大幅节约开发时间和成本。 我们来一起看看几个明朗大气的管理控制台页面。 本文档会持续更新 模板编号&#xff1a;翠花_001模板编号&#xff1a;翠花_002模板编号&#xff1a;翠花_003

01 centos7中cmake配置crow开发环境

一、搭建开发环境 1.1 c开发环境 yum -y install gcc gcc-c gdb git1.2 安装crow所需依赖 yum install boost boost-devel yum install openssl openssl-devel1.3 安装cmake_3.27.9 可以借鉴此安装&#xff1a;https://blog.csdn.net/i_coding_/article/details/131883590 …

nginx的匹配及重定向

一、nginx的匹配&#xff1a; nginx中location的优先级和匹配方式&#xff1a; 1.精确匹配&#xff1a;location / 对字符串进行完全匹配&#xff0c;必须完全符合 2.正则匹配&#xff1a;location ^~ ^~ 前缀匹配&#xff0c;以什么为开头 ~区分大小写的匹配 ~* 不区分…

IDEA:插件和配置推荐(2024版)

文章目录 一、插件1.1 主题1.2 代码缩略图1.3 Maven插件2.4 彩虹括号2.5 翻译插件2.6 图标插件2.7 MyBatis插件2.8 阿里巴巴开发规范 二、全局配置2.1 主题2.2 字符编码2.3 注释颜色2.4 自动导包2.5 鼠标控制界面大小 三、新项目设置3.1 Maven3.2 SDK 四、恢复初始化 一、插件 …

SpringBoot 多数据源配置

目录 一. 引入maven依赖包 二. 配置yml 三、创建 xml 分组文件 四、切换数据源 一. 引入maven依赖包 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.6.1&…

【Linux】Linux用户,用户组,其他人

1.文件拥有者 初次接触Linux的朋友大概会觉得很怪异&#xff0c;怎么“Linux有这么多用户&#xff0c;还分什么用户组&#xff0c;有什用呢&#xff1f;”&#xff0c;这个“用户与用户组”的功能可是相当健全而且好用的一个安全防护措施。 怎么说呢&#xff1f;由于Linux是个…

Redis数据结构—跳跃表skiplist

想象一下&#xff0c;你正在参加一场长跑比赛&#xff0c;跑道是一条直线&#xff0c;而且所有参赛者按照他们的号码牌顺序站好。现在&#xff0c;你的任务是从队伍的一头快速找到某个特定的参赛者。 如果跑道上只有你一个人在找人&#xff0c;你可能需要从头开始&#xff0c;…

【C++】解决 C++ 语言报错:Dangling Pointer

文章目录 引言 悬挂指针&#xff08;Dangling Pointer&#xff09;是 C 编程中常见且危险的错误之一。当程序试图访问指向已释放内存的指针时&#xff0c;就会发生悬挂指针错误。这种错误不仅会导致程序崩溃&#xff0c;还可能引发不可预测的行为和安全漏洞。本文将深入探讨悬…