设计模式(3)--对象结构(4)--装饰

1. 意图

    动态地给一个对象添加一些额外的功能。

2. 四种角色

    抽象组件(Component)、具体组件(Concrete Component)、抽象装饰(Decorator)、具体装饰(Concrete Decorator)

3. 优点

    3.1 比静态继承更灵活。

    3.2 避免在层次结构高层的类有太多的特征。"即用即付",只添加需要的特征。

4. 缺点

    4.1 Decorator与它的Component不一样。

           一个被装饰了的组件与这个组件是有差别的,使用装饰时不能依赖对象标识。

    4.2 有许多小对象,会难于学习和排错。

5. 相关模式

    5.1 装饰仅改变对象的职责而不改变接口,而适配器给对象一个全新的接口。

    5.2 可以将装饰视为一个退化的,仅有一个组件的组合,但它的目的不在于对象聚集。

    5.3 装饰可以改变对象的外表,而策略模式可以改变对象的内核。

6. 代码示意(C++)
#pragma once
#include <iostream>
#include <string>
using namespace std;

class Component
{
protected:
	string m_strName;
public:
	Component(const string& strName)
	{
		m_strName = strName;
	}
	virtual void Operation() = 0;
};

class ConcreteComponent : public Component
{
public:
	ConcreteComponent(const string& strName) :Component(strName)
	{
	}
	virtual void Operation() {
		cout << "我是:" << m_strName << endl;
	}
};

class Decorator : public Component
{
	Component* m_pComponent;
public:
	Decorator(const string& strName) :Component(strName) {
		m_pComponent = 0;
	}
	virtual void Operation() {
		if (m_pComponent != 0) {
			m_pComponent->Operation();
		}
	}
public:
	void Decorate(Component* pComponent) {
		m_pComponent = pComponent;
	}
};

class ConcreteDecoratorA :public Decorator
{
	string m_addedState;
public:
	ConcreteDecoratorA(const string& strName) :Decorator(strName) {
		m_addedState = ",has addedState";
	}
	virtual void Operation() {
		Decorator::Operation();
		cout << "我是:" << m_strName << m_addedState << endl;
	}
};
class ConcreteDecoratorB :public Decorator
{
public:
	ConcreteDecoratorB(const string& strName) :Decorator(strName) {
	}
	virtual void Operation() {
		Decorator::Operation();
		AddedBehavior();
	}
private:
	void AddedBehavior() {
		cout << "我是:" << m_strName << ",has addedBehavior" << endl;
	}
};

#include "Decorator.h"
int main()
{
	Component* pOrigin = new ConcreteComponent("Original");

	Decorator* pDecorator = new ConcreteDecoratorA("DecoratorA");
	pDecorator->Decorate(pOrigin);
	pDecorator->Operation();

	delete pDecorator;

	pDecorator = new ConcreteDecoratorB("DecoratorB");
	pDecorator->Decorate(pOrigin);
	pDecorator->Operation();

	delete pDecorator;
	delete pOrigin;
	return 0;
}

运行结果:

6.1 装饰不是单纯的继承,它还持有被装饰者的指针,更灵活(3.1)

6.2 不同的装饰器可以添加不同的功能,也可以叠加给被装饰者(3.2)

    Component* pOrigin = new ConcreteComponent("Original");	
    Decorator* pDecoratorA = new ConcreteDecoratorA("DecoratorA");
	pDecoratorA->Decorate(pOrigin);

	Decorator *pDecoratorB = new ConcreteDecoratorB("DecoratorB");
	pDecoratorB->Decorate(pDecoratorA);
	pDecoratorB->Operation();

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【洛谷算法题】P1424-小鱼的航程(改进版)【入门2分支结构】Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P1424-小鱼的航程&#xff08;改进版&#xff09;【入门2分支结构】&#x1f30f…

程序员必备算法

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

60.Sentinel源码分析

Sentinel源码分析 1.Sentinel的基本概念 Sentinel实现限流、隔离、降级、熔断等功能&#xff0c;本质要做的就是两件事情&#xff1a; 统计数据&#xff1a;统计某个资源的访问数据&#xff08;QPS、RT等信息&#xff09; 规则判断&#xff1a;判断限流规则、隔离规则、降级规…

Linux下I2C调试工具--for--Zynq MPSOC/Jetson Xavier

Linux下I2C调试工具 1、简介 i2c-tools是一个专门调试i2c的工具&#xff0c;无需编写任何代码即可轻松调试IC设备&#xff0c;可获取挂载的设备及设备地址&#xff0c;还可以在对应的设备指定寄存器设置值或者获取值等功能。i2c-tools有如下几个常用测试命令i2cdetect, i2cdu…

【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(四)用户管理、部门管理模块

第一篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;一&#xff09;搭建项目 第二篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;二&#xff09;日志输出中间件、校验token中间件、配置路由、基础工具函数。 …

新手运行若依项目|若依项目各部分介绍|并修改自己需要的页面

新手运行若依项目|若依项目各部分介绍|并修改自己需要的页面 文章目录 新手运行若依项目|若依项目各部分介绍|并修改自己需要的页面前言IEDA如何运行若依项目若依项目目录简介ruo-yi common工具类ruoyi-framework 框架核心其他部分ruo一admin后台服务通用配置 application.yml数…

STM32 TIM定时中断设计

单片机学习 目录 文章目录 一、定时器定时中断设计步骤 二、定时器配置 1.RCC开启时钟 2.选择时钟源 3.配置时基单元 4.配置输出中断控制 5.配置NVIC 6.运行控制 三、设计中断函数 总结 一、定时器定时中断设计步骤 定时中断基本框架结构图&#xff1a; 根据结构图可按步骤配置…

AWS RDS慢日志文件另存到ES并且每天发送邮件统计慢日志

1.背景&#xff1a;需要对aws rds慢日志文件归档到es&#xff0c;让开发能够随时查看。 2.需求&#xff1a;并且每天把最新的慢日志&#xff0c;过滤最慢的5条sql 发送给各个产品线的开发负责人。 3.准备&#xff1a; aws ak/sk &#xff0c;如果rds 在不同区域需要认证不同的…

【Linux】进程周边005之环境变量

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.环境变量是什么&#xff1…

工具化法则

《卓越成效的程序员》是若干程序员系列书籍我比较喜欢的一本&#xff0c;类似的还有《卓越程序员密码》等。《卓越成效的程序员》高明之处是不仅仅给出原则&#xff0c;还大谈工具和代码&#xff0c;这如同诸多鸡汤文在”布道”的层面之下实战干货&#xff0c;深得广大从业人员…

使用openMVS库,在VS2022中启用c++17标准编译仍然报错

使用openMVS库&#xff0c;在VS2022中启用c17标准编译仍然报错 现象 项目中引用了某些开源库&#xff08;例如openmvs2.1.0&#xff09;&#xff0c;编译时要求启用编译器对c17的支持。 没问题&#xff01;大家都知道在下图所示的位置调整C语言标准&#xff1a; 但是&#…

【Transformer】Transformer and BERT(1)

文章目录 TransformerBERT 太…完整了&#xff01;同济大佬唐宇迪博士终于把【Transformer】入门到精通全套课程分享出来了&#xff0c;最新前沿方向 学习笔记 Transformer 无法并行&#xff0c;层数比较少 词向量生成之后&#xff0c;不会变&#xff0c;没有结合语境信息的情…

动态加载库

no_mangle 不要改标识符 首先是认识这个标注&#xff1a;mangle&#xff0c;英文的含义“撕裂、碾压”。我第一次把这个单次误以为是manage&#xff0c;说实话两个单词还挺像的。 RUS中函数或静态变量使用#[no_mangle]这个标注属性后&#xff0c;编译器就不会修改它们的名字了…

机器学习 | KNN算法

一、KNN算法核心思想和原理 1.1、怎么想出来的&#xff1f; 近朱者赤&#xff0c;近墨者黑&#xff01; 距离决定一切、民主集中制 1.2、基本原理 —— 分类 k个最近的邻居 民主集中制投票分类表决与加权分类表决 1.3、基本原理 —— 回归 计算未知点的值决策规则不同均值法与…

windows10-EMQX与MQTTX的安装及配置使用教程

windows10-EMQX安装及配置使用教程 一、下载安装1.1 下载1.2 安装1.3 设置开机自启动 二、连接MQTT2.1 MQTT下载安装2.1.1 下载2.1.2 安装及配置 三、EMQX常用命令 本文介绍的是在windows10系统下的emqx的安装、配置及使用教程。 一、下载安装 1.1 下载 下载链接&#xff1a…

设计模式之创建型设计模式(一):单例模式 原型模式

单例模式 Singleton 1、什么是单例模式 在软件设计中&#xff0c;单例模式是一种创建型设计模式&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 这意味着无论何时需要该类的实例&#xff0c;都可以获得相同的实例&#xff0c;而不会创建…

1.新入手的32位单片机资源和资料总览

前言&#xff1a; 学了将近1年的linux驱动和uboot&#xff0c;感觉反馈不足&#xff0c;主要是一直在学各种框架&#xff0c;而且也遇到了门槛&#xff0c;比如驱动部分&#xff0c;还不能随心所欲地编程&#xff0c;原因是有些外设的原理还不够深刻、有些复杂的底层驱动的代码…

Vue3知识点总结

目录 一.创建Vue2工程 1.使用 vue-cli 创建 2.使用 vite 创建 二.常用 Composition API setup ref函数 reactive函数 计算属性与监视 1.computed函数 2.watch函数 3.watchEffect函数 一.创建Vue2工程 1.使用 vue-cli 创建 查看vue/cli版本&#xff0c;确保vue/cli版本…

【2023海光杯】“智能储物柜系统”电控部分

简单说明 在代码实现部分会给出设计理念和分析&#xff0c;整体资源可以直接下载压缩包&#xff08;手机端依然看不到&#xff0c;还是不知道为什么&#xff09;。 使用设备 按照题目要求需要制作16个储物格&#xff0c;对应16扇门。16扇门的开关可以用矩阵键盘来控制。 在不考…

C# 基本桌面编程(二)

一、前言 本章为C# 基本桌面编程技术的第二节也是最后一节。前一节在下面这个链接 C# 基本桌面编程&#xff08;一&#xff09;https://blog.csdn.net/qq_71897293/article/details/135024535?spm1001.2014.3001.5502 二、控件布局 1 叠放顺序 在WPF当中布局&#xff0c;通…