当前位置: 首页 > news >正文

装饰器模式(C++)

定义

动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码&减少子类个数)。
一《设计模式》 GoF

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

使用场景

  • 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。
  • 如何使“对象功能的扩展"能够根据需要来动态地实现?同时避免“扩展功能的增多"带来的子类膨胀问题?从而使得任何“功能扩展变化"所导致的影响将为最低?

结构

在这里插入图片描述

代码示例

//Decorator.h
/****************************************************/
#ifndef DECORATOR_H
#define DECORATOR_H
#include<iostream>
using namespace std;//创建一个形状的接口
class shape
{
public:shape() {};virtual ~shape() {};virtual void draw()=0;
};//创建圆形circle类继承形状基类接口
class circle :public shape
{
public:circle(){};~circle(){};void draw(){cout << "draw circle" << endl;}
};//创建一个三角形rectangle类继承形状shape基类
class rectangle :public shape
{
public:rectangle(){};~rectangle(){};void draw(){cout << "draw rectangle" << endl;}
};//创建一个形状装饰器ShapeDecorator类继承形状shape基类
class ShapeDecorator:public shape
{
public:ShapeDecorator(shape *td){decoratedshape = td;}virtual ~ShapeDecorator(){};void draw(){decoratedshape->draw();}
protected:shape *decoratedshape;
};//扩展ShapeDecorator为RedShapeDecorator
class RedShapeDecorator : public ShapeDecorator
{
public:RedShapeDecorator(shape *tf):ShapeDecorator(tf){}~RedShapeDecorator(){};void draw(){decoratedshape->draw();setRedBorder(decoratedshape);}
private://设置边框颜色void setRedBorder(shape *tg){cout << "Border Color:Red" << endl;}
};#endif
//test.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Decorator.h"int main()
{shape *redCircle = (shape*)new RedShapeDecorator(new circle());shape *redRectangle = (shape*)new RedShapeDecorator(new rectangle());redCircle->draw();redRectangle->draw();delete redCircle;delete redRectangle;return 0;
}

运行结果
在这里插入图片描述

要点总结

  • 通过采用组合而非继承的手法,Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了使用继承带来的“灵活性差”和“多子类衍生问题”。
  • Decorator类在接口上表现为is-a Component的继承关系,即Decorator类继承了Component类所具有的接口。但在实现上又表现为has-a Component的组合关系,即Decorator类又使用了另外一个Component类。
  • Decorator模式的目的并非解决“多子类衍生的多继承”问题,Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”一是为“装饰”的含义。

相关文章:

装饰器模式(C++)

定义 动态(组合)地给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类(继承)更为灵活(消除重复代码&减少子类个数)。 一《设计模式》 GoF 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xf…...

matlab使用教程(12)—随机数种子和随机数流

1.生成可重复的随机数 1.1指定种子 本示例显示如何通过首先指定种子来重复生成随机数数组。每次使用相同种子初始化生成器时&#xff0c;始终都可以获得相同的结果。首先&#xff0c;初始化随机数生成器&#xff0c;以使本示例中的结果具备可重复性。 rng( default ); 现在…...

【Java】JVM GC配置指南

1、JDK版本 以下所有优化全部基于JDK8版本&#xff0c;强烈建议低版本升级到JDK8&#xff0c;并尽可能使用update_191以后版本。 2、如何选择垃圾回收器 响应优先应用&#xff1a;面向C端对响应时间敏感的应用&#xff0c;堆内存8G以上建议选择G1&#xff0c;堆内存较小或低…...

11.Eclipse 注释模板的说明及设置

1.在eclipse中点击Window——>java——>Code Style——>CodeTemplates——>Comments 2.常用Variable 3. 我的注释模板 ①Files 文件 /** * Title: ${file_name}* Description: ${todo}* author Jeremy* date ${currentDate:date(yyyy-MM-dd hh:mm:ss)} */ ②Typ…...

Maven父子工程项目的配置

在Java的Maven多模块&#xff08;父子工程&#xff09;项目中&#xff0c;Maven插件的配置非常重要&#xff0c;因为它们可以帮助你进行项目构建、测试、打包等各种任务。以下是一个简单的父子工程Maven插件配置的示例&#xff1a; 假设你有如下的项目结构&#xff1a; paren…...

jumpserver命令记录膨胀问题

一.背景 jumpserver堡垒机针对只是接管ssh来说&#xff0c;正常操作Linux的指令记录应该不会太多&#xff0c;每天有个几千条都已经算很多了。所以默认jumpserver采用MySQL作为存储介质本身也没啥问题。但是我们使用jumpserver对【MySQL应用】进行了托管&#xff0c;导致查询SQ…...

ControlNet

2023.8.10 Adding Conditional Control to Text-to-Image Diffusion Models 对于 T2I 扩散模型添加 条件控制 相关联比较大的几篇论文&#xff1a; 0.Abstract 可以为预训练的扩散模型提供额外的输入条件控制。不需要很多计算资源。 即使在小数据集上&#xff0c;也具有鲁棒…...

竞赛项目 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…...

​Windows dos文件夹与文件怎么创建与删除

在Windows操作系统中&#xff0c;你可以使用命令行工具&#xff08;命令提示符或PowerShell&#xff09;来创建和删除文件夹和文件。以下是创建和删除文件夹和文件的基本方法&#xff1a; 创建文件夹&#xff1a; 使用mkdir命令来创建文件夹&#xff08;目录&#xff09;。 m…...

JVM总结2

1.基本概念 java代码执行 代码编译class&#xff1a;javac 源文件通过编译器产生字节码文件&#xff0c;字节码文件通过jvm的解释器编译成机器上的机器码 装载class&#xff1a;ClassLoader执行class&#xff1a; 解释执行编译执行 client compilerserver compiler 内存管理…...

servlet三大类HttpSevlet,HttpServletRequest,HttpServletResponse介绍

一、HttpServlet HttpServlet类是一个被继承的方法&#xff0c;可以看做一个专门用来响应http请求的类&#xff0c;这个类的所有方法都是为响应http请求服务的&#xff0c;要对一个某个路径谁知http响应时&#xff0c;需要写一个类来继承HttpServlet类&#xff0c;并重写里面的…...

【雕爷学编程】Arduino动手做(12)---霍尔模块之霍尔磁感应声光报警器(磁控开关,接220V)

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…...

认识 SQL

文章目录 1.简介2.组成3.工作原理4.五种子语言5.注释方式6.字符串表示方式参考文献 1.简介 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理和操作关系型数据库的标准化查询语言。它是一种领域特定语言&#xff08;DSL&#x…...

【剑指Offer 58】翻转单词顺序,Java解密。

LeetCode 剑指Offer 75道练习题 文章目录 剑指Offer:翻转单词顺序示例:限制:解题思路:剑指Offer:翻转单词顺序 【题目描述】 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a stu…...

微服务Ribbon-负载均衡原理

目录 一、LoadBalancerIntercepor 二、LoadBalancerClient 三、负载均衡策略IRule 四、总结 上一篇中&#xff0c;我们添加了LoadBalanced注解&#xff0c;即可实现负载均衡功能&#xff0c;这是什么原理呢&#xff1f; SpringCloud底层其实是利用了一个名为Ribbon的组件&…...

如何实现Vue的异步组件?如何在Vue中使用本地存储?什么是Vue的指令模块化?

1、如何实现Vue的异步组件&#xff1f; 在Vue中&#xff0c;可以使用异步组件来加载远程数据&#xff0c;或者在组件的生命周期中执行一些耗时操作。实现异步组件&#xff0c;需要使用Vue的异步组件和Vue的组件系统。 下面是一个基本的示例&#xff1a; <template><…...

《HeadFirst设计模式(第二版)》第六章代码——命令模式

代码文件目录&#xff1a; Command package Chapter6_CommandPattern.Command;/*** Author 竹心* Date 2023/8/6**/public interface Command {public void execute();public void undo();//撤销该指令 }CeilingFan package Chapter6_CommandPattern.ElectricAppliance;/*** …...

JS 原型与继承2

//***-、原型、原型链、构造函数 prototype、 proto_、constructor function Foo(){this.a1} var foo new Foo(); Object.getPrototypeOf(foo);//访问对象原型 效果等同于&#xff0c;foo. proto &#xff0c;只是更推荐使用 Es6的 Object.getPrototypeof()方式 // construct…...

账号登录相关的一点随笔

最后更新于2023年8月8日 14:25:32 JWT验证&#xff1a; 简单&#xff1a;一个token验证&#xff1b; 前端发来登录信息&#xff0c;后端验证通过后&#xff0c;将token发回前端&#xff1b; 复杂&#xff1a;Access Token Refresh Token验证&#xff1a; 将Access Token和R…...

常见的一些BUG

常见的一些BUG&#xff0c;但实际上在编写代码时&#xff0c;我们应该尽可能避免这些类型的错误&#xff1a; 变量名与函数名冲突&#xff1a; def main(): print("Hello, World!") main 5 print("The value of main is:", main) 函数参数传递错误&…...

K8s ConfigMap实战全解析

ConfigMap祥解 ConfigMap与 Secret 类似&#xff0c;用来存储配置文件的kubernetes资源对象&#xff0c;所有的配置内容都存储在etcd中。与 Secret 的区别&#xff1a; ConfigMap 保存的是不需要加密的、应用所需的配置信息。ConfigMap 的用法几乎与 Secret 完全相同&#xff1…...

Product Hunt 每日热榜 | 2026-04-09

1. Velo 标语&#xff1a;将任何内容分享为视频消息。 介绍&#xff1a;Velo 利用人工智能将你的原始屏幕录制转化为值得一看的、随时可以分享的视频。 产品网站&#xff1a; 立即访问 Product Hunt&#xff1a; View on Product Hunt 关键词&#xff1a;Velo, 视频消息, A…...

【仅限首批200位工程师开放】工业PHP网关配置诊断工具包(含自动巡检脚本+配置熵值评分模型+整改优先级热力图)

第一章&#xff1a;工业PHP网关配置的演进与工程挑战工业级PHP网关已从早期的简单NginxPHP-FPM反向代理&#xff0c;演进为集路由分发、协议转换、熔断限流、可观测性注入于一体的复合中间件层。这一演进在提升系统弹性的同时&#xff0c;也带来了配置复杂度指数级上升、多环境…...

6个步骤让Windows系统性能提升60%:Win11Debloat全方位优化指南

6个步骤让Windows系统性能提升60%&#xff1a;Win11Debloat全方位优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutte…...

ABAP RFC SQL 模糊查询与动态区间条件实战解析

1. ABAP RFC接口中的模糊查询实战技巧 在SAP系统开发中&#xff0c;RFC&#xff08;Remote Function Call&#xff09;接口是实现跨系统数据交互的核心技术。当外部系统需要从SAP获取数据时&#xff0c;模糊查询功能往往成为刚需。不同于选择屏幕的便捷操作&#xff0c;RFC接口…...

Qwen3.5-4B-Claude-Opus-GGUF智能助手:产品需求文档结构化分析与PRD撰写辅助

Qwen3.5-4B-Claude-Opus-GGUF智能助手&#xff1a;产品需求文档结构化分析与PRD撰写辅助 1. 产品需求文档撰写的挑战与解决方案 产品需求文档(PRD)是产品开发过程中至关重要的文件&#xff0c;它定义了产品的功能、特性和行为。然而&#xff0c;撰写高质量的PRD往往面临以下挑…...

Dell R730xd老将焕新记:保姆级教程搞定ESXi 8.0u3d,附网卡驱动避坑指南

Dell R730xd服务器升级ESXi 8.0u3d全流程实战指南 当企业IT基础设施进入更新周期&#xff0c;许多运维团队都会面临一个现实问题&#xff1a;那些曾经稳定服役多年的服务器硬件&#xff0c;是否还能适配最新的虚拟化平台&#xff1f;以Dell PowerEdge R730xd这款经典2U服务器为…...

Wan2.2-I2V-A14B生成奇幻场景概念图:游戏原画师辅助工具实践

Wan2.2-I2V-A14B生成奇幻场景概念图&#xff1a;游戏原画师辅助工具实践 1. 效果亮点开场 Wan2.2-I2V-A14B模型在奇幻场景概念图生成方面展现出惊人的能力&#xff0c;其生成的图像质量已经达到专业游戏原画水准。这款工具特别擅长处理复杂场景描述&#xff0c;能将文字想象快…...

WeChatExporter技术指南:iOS微信聊天记录全量导出解决方案

WeChatExporter技术指南&#xff1a;iOS微信聊天记录全量导出解决方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter WeChatExporter是一款开源工具&#xff0c;专注于解…...

什么是OPC

### 先说一个残酷的事实 你在公司干了十年&#xff0c;名片上印着"总监""教授""专家"。 但那些头衔&#xff0c;离职那天就跟你没关系了。 你带过的团队、做过的项目、写过的PPT&#xff0c;公司服务器一关&#xff0c;痕迹全无。 你真正能带走的…...