6. 装饰器

UML

在这里插入图片描述

  • 聚合(Aggregation)关系:大雁和雁群,上图中空心菱形+箭头表示聚合关系
  • 组合(Composition)关系:大雁和翅膀 ,实心菱形+箭头表示组合(Composition)关系

测试代码

#include <iostream>
#include <stdio.h>
#include <mutex>//锁头文件using namespace std;class Component{
public:virtual void Operation() = 0;virtual ~Component(){}
};
class ConcreteComponent:public Component
{
public:void Operation(){cout << "ConcreteComponent" << endl;}
};class Decorator:public Component{
protected:Component *component = nullptr;
public:void SetComponent(Component *_component){this->component = _component;}void Operation(){if(component != nullptr){component->Operation();}}
};
class ConcreteDecoratorA:public Decorator
{
private:string addedState;
public:void Operation(){Decorator::Operation();addedState = "new State";cout << "具体装饰对象A的操作" << endl;}
};class ConcreteDecoratorB:public Decorator
{
public:void Operation(){Decorator::Operation();AddedBehavior();cout << "具体装饰对象B的操作" << endl;}
private:void AddedBehavior(){cout << "AddedBehavior" << endl;}
};
int main(void)
{ConcreteComponent *c = new ConcreteComponent();ConcreteDecoratorA *d1 = new ConcreteDecoratorA();ConcreteDecoratorB *d2 = new ConcreteDecoratorB();d1->SetComponent(c);d2->SetComponent(d1);d2->Operation();cout << "--endl--" << endl;return 0;
}

输出

ConcreteComponent
具体装饰对象A的操作
AddedBehavior
具体装饰对象B的操作
--endl--

装饰模式是利用SetComponent来对对象进行包装的。这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中

装饰模式变身

如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类

根据这段文字的描述,UML结构图变身后的形态
在这里插入图片描述
C++改写后的UML图和代码
在这里插入图片描述

代码:

#include <iostream>
#include <stdio.h>
#include <mutex>//锁头文件using namespace std;//“Person”类(ConcreteComponent)
class Person{
public:Person(){}Person(string _name):name(_name){}virtual void Show(){cout << "装扮的:" << this->name << endl;}
private:string name;
};
//服饰类(Decorator)
class Finery:public Person
{
public:Person *component = nullptr;void Decorate(Person *_component){this->component = _component;}virtual void Show(){if(component != nullptr){component->Show();}}
};
class fengyi:public Finery
{
public:virtual void Show(){cout << "风衣" << endl;Finery::Show();}
};class yundongxie:public Finery
{
public:virtual void Show(){cout << "运动鞋" << endl;Finery::Show();}
};
class mojing:public Finery
{
public:void Show(){cout << "墨镜" << endl;Finery::Show();}
};
class kouzhao:public Finery
{
public:void Show(){cout << "口罩" << endl;Finery::Show();}
};
class xifu:public Finery
{
public:void Show(){cout << "西服" << endl;Finery::Show();}
};
int main(void)
{cout << "装扮1" << endl;Person *p1 = new Person("lkmao");fengyi *fy = new fengyi();yundongxie *ydx = new yundongxie();fy->Decorate(p1);ydx->Decorate(fy);ydx->Show();cout << endl << "装扮2" << endl;Person *p2 = new Person("laoliu");mojing *mj = new mojing();kouzhao *kz = new kouzhao();xifu *xf = new xifu();mj->Decorate(p2);kz->Decorate(mj);xf->Decorate(kz);xf->Show();cout << "--endl--" << endl;return 0;
} 

输出

装扮1
运动鞋
风衣
装扮的:lkmao装扮2
西服
口罩
墨镜
装扮的:laoliu
--endl--

参考:https://blog.csdn.net/yueni_zhao/article/details/128946954

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

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

相关文章

海勒姆法则(Hyrum‘s Law)

在对于共享代码库的足够大的用户群中&#xff0c;有人会依赖于你代码的任何可能特性——包括你的漏洞。 摘要 Hyrum’s Law&#xff0c;海勒姆法则&#xff0c;是软件开发中的一个原则&#xff0c;它的核心思想是&#xff1a;当一个接口被足够数量的用户使用时&#xff0c;不论…

Spring复杂对象的3中创建方法

复杂对象是相对于简单对象可以直接 new 出的对象。这种对象在 Spring 中不可以通过简单对象的创建方式来创建。下面我们将通过实现 FactoryBean 接口、实例工厂、静态工厂三种方法来创建。 FactoryBean 接口 Spring 提供 FactoryBean 接口并且提供了 getObject 方法是为了支持…

“熊猫杯” | 赛宁网安获网络安全优秀创新成果大赛优胜奖

9月11日&#xff0c;四川省2023年国家网络安全宣传周正式启动。由四川省委网信办指导&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;主办&#xff0c;成都信息工程大学、四川省网络空间安全协会承办的“2023年网络安全优秀创新成果大赛—成都分站赛(暨四川省‘…

MYSQL 主从搭建详细步骤和测试

MySQL主备搭建 1.主库配置 以下所有操作均在主服务器上执行 1&#xff09;创建用户并授权 create user slave identified with mysql_native_password by 123456 mysql>GRANT REPLICATION SLAVE ON *.* to slave% identified by 123456; //如果用户已存在&#xff0c;会改密…

使用差分进化算法进行关键帧提取:Python实践与详细指南

1. 差分进化算法简介 差分进化算法(Differential Evolution, DE)是一种为实数编码的全局优化问题设计的启发式搜索方法。DE的基本原理是通过对种群中的个体进行差分变异、交叉和选择操作来进化种群,使种群逐渐趋近于问题的全局最优解。 DE算法的基本步骤包括: 初始化:随…

Spring Boot - 用JUnit 5构建完美的Spring Boot测试套件

文章目录 PreJUnit 4 vs JUnit 5Junit5 常用注解栗子 Pre SpringBoot - 单元测试利器Mockito入门 SpringBoot - 应用程序测试方案 SpringBoot - SpringBootTest加速单元测试的小窍门 Spring Boot - Junit4 / Junit5 / Spring Boot / IDEA 关系梳理 package org.junit.jupit…

Excel VBA 变量,数据类型常量

几乎所有计算机程序中都使用变量&#xff0c;VBA 也不例外。 在过程开始时声明变量是一个好习惯。 这不是必需的&#xff0c;但有助于识别内容的性质&#xff08;文本&#xff0c;​​数据&#xff0c;数字等&#xff09; 在本教程中&#xff0c;您将学习- 一、VBA变量 变量是…

webpack:详解CopyWebpackPlugin,复制的同时修改文件内容

摘要 CopyWebpackPlugin 是一个强大的 Webpack 插件&#xff0c;用于将文件从源目录复制到构建目录。在本文中&#xff0c;我们将探讨 CopyWebpackPlugin 的一些常用 API&#xff0c;并提供示例代码。 在构建 Web 应用程序时&#xff0c;通常需要将一些静态文件&#xff08;如…

数据治理-定义数据治理运营框架

开发数据治理的基本定义很容易&#xff0c;但是创建一个组织采用的运营框架可能很困难。在构建组织的运营框架时需要考虑以下几个方面&#xff1a; 数据对组织的价值。如果一个组织出售数据&#xff0c;显然数据治理具有巨大的业务影响力。将数据作为最有价值事物的组织将需要…

Unity中程序集dll

一&#xff1a;前言 一个程序集由一个或多个文件组成&#xff0c;通常为扩展名.exe和.dll的文件称为程序集&#xff0c;.exe是静态的程序集&#xff0c;可以在.net下直接运行加载&#xff0c;因为exe中有一个main函数(入口函数&#xff09;&#xff0c;.dll是动态链接库&#…

腾讯mini项目-【指标监控服务重构】2023-08-04

今日已办 关于 span-references 的调研 https://github.com/DataDog/dd-trace-js/issues/1761 https://github.com/open-telemetry/opentelemetry-specification/blob/874a451e7f6ac7fc54423ee3f03e5394197be35b/specification/compatibility/opentracing.md#span-references h…

基于springboot的OA人事办公管理系统

经典 oasys(OA自动化办公系统) 办公自动化&#xff08;OA&#xff09;是面向组织的日常运作和管理,员工及管理者使用频率最高的应用系统&#xff0c;极大提高公司的办公效率。 项目介绍 oasys是一个OA办公自动化系统&#xff0c;使用Maven进行项目管理。基于springboot框架开…

为什么要使用设计模式,以及使用设计模式的好处

在软件开发中&#xff0c;衡量软件质量只要包含如下指标&#xff1a; 正确性可维护性可读性可扩展性简洁性可测试性健壮性灵活性可复用性 然而&#xff0c;对于一些刚入行的新程序员来说&#xff0c;往往会注意不到上面这些问题&#xff0c;从而产生了一些让人头皮发麻的烂代…

【css】深入理解flex属性

参考文章&#xff1a; 深入理解Flex属性 flex弹性布局教程-05-项目属性flex-shrink flex&#xff1a;flex-grow flex-shrink flex-basis flex&#xff1a;0 1 0 如何计算flex布局&#xff0c;有flex-shrink和flex-grow的情况下&#xff0c;每个元素的大小 flex-grow生效公式如…

mongodb 安装

yum 安装 阿里镜像库 , 注意不要用阿里自带的系统 , 要用centos镜像 # 创建一个 .repo 文件 vi /etc/yum.repos.d/mongodb-org.repo# 添加内容[mongodb-org] name MongoDB Repository baseurl https://mirrors.aliyun.com/mongodb/yum/redhat/$releasever/mongodb-org/4.4/…

谷粒商城----rabbitmq

一、 为什么要用 MQ? 三大好处&#xff0c;削峰&#xff0c;解耦&#xff0c;异步。 削峰 比如秒杀&#xff0c;或者高铁抢票&#xff0c;请求在某些时间点实在是太多了&#xff0c;服务器处理不过来&#xff0c;可以把请求放到 MQ 里面缓冲一下&#xff0c;把一秒内收到的…

Unity中Shader抓取屏幕并实现扭曲效果

文章目录 前言一、屏幕抓取&#xff0c;在上一篇文章已经写了二、实现抓取后的屏幕扭曲实现思路&#xff1a;1、屏幕扭曲要借助传入 UV 贴图进行扭曲2、传入贴图后在顶点着色器的输入参数处&#xff0c;传入一个 float2 uv : TEXCOORD&#xff0c;用于之后对扭曲贴图进行采样3、…

写一篇nginx配置指南

nginx.conf配置 找到Nginx的安装目录下的nginx.conf文件&#xff0c;该文件负责Nginx的基础功能配置。 配置文件概述 Nginx的主配置文件(conf/nginx.conf)按以下结构组织&#xff1a; 配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理…

计算机网络(二):TCP篇

文章目录 1. TCP头部包含哪些内容&#xff1f;2. 为什么需要 TCP 协议&#xff1f; TCP 工作在哪一层&#xff1f;3. 什么是 TCP &#xff1f;4. 什么是 TCP 连接&#xff1f;5. 如何唯一确定一个 TCP 连接呢&#xff1f;6. UDP头部大小是多少&#xff1f;包含哪些内容&#xf…

burp+IE 微信小程序抓包教程

文章目录 一、BURP里新增监听端口二、BURP导出证书三、导入证书四、IE代理设置五、小程序抓包实际测试 一、BURP里新增监听端口 找一个没用的端口&#xff0c;使用以下方式新增 二、BURP导出证书 选择刚才新增的监听端口&#xff0c;点击证书导入导出 将其存出来即可&…