设计模式学习笔记-装饰模式

Optuna 3.5 对比 Grid/Random Search:CatBoost 模型 100 次试验效率提升 70% 实测 本文通过对比Optuna 3.5、Grid Search和Random Search在CatBoost模型超参数优化中的表现,实测显示Optuna的TPE算法在100次试验中效率提升70%。文章详细分析了三种方法的差异,并提供了优化技巧和场景选型建议,帮助开发者更高效地进行超参数优化。 阅读详情

设计模式学习笔记

 

摘要:以下为Tree_ch的设计模式学习笔记

 

装饰模式

 

1.引言
如果我们对自己所居住的房间不满意的时候,我们往往是通过装修的方式来使我们的房间变的漂亮起来。而不是重新建一个房间。而且经过装修的屋子仍让是原来的屋子,本质不会变,但它的确变漂亮了,满足了我们的美的需求。从投入来看,装修比重新建设显然要便宜的多! 在软件设计里面,此类情形的设计既可以采用装饰模式(Decorator)来完成。
2.
概念与模式

装饰模式(Decorator)也叫包装器模式(Wrapper)。GOF在《设计模式》一书中给出的定义为:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
装饰模式的实现类关系图为:

1)        抽象构件角色(Component):定义一个抽象接口,以规范准备接收附加责任的对象。

2)        具体构件角色(Concrete Component):这是被装饰者,定义一个将要被装饰增加功能的类。

3)        装饰角色(Decorator):持有一个构件对象的实例,并定义了抽象构件定义的接口。

4)        具体装饰角色(Concrete Decorator):负责给构件添加增加的功能。


3.
应用实例
一部手机,在其接受到来电的时候,会发出声音来提醒主人。而现在我们需要为该手机添加一项功能,在接收来电的时候,产生震动,而令一部更加高级,不仅发声,而且振动,而且有灯光闪烁。
用装饰模式来解决这个问题的类关系图为:

 

 

 

以下为我用C++实现的实例:

#include <iostream>

using namespace std;

//Component

class IPhone{
public
:
    
virtual void ReceiveCall() = 0
;
}
;

//Concrete Component

class BasePhone:public IPhone{
public
:
    
virtual void
 ReceiveCall()
    
{
        printf(
"Ring... "
);
    }

}
;

//Decorator

class PhoneDecorator:public IPhone{
private
:
    IPhone
*
 pphone;
public
:
    PhoneDecorator(IPhone
*
 pphone)
    
{
        
if(pphone !=
 NULL)
        
{
            
this->pphone =
 pphone;
        }

        
else
        
{
            
this->pphone = new
 BasePhone();
        }

    }


    
virtual void ReceiveCall()
    
{
        pphone
->
ReceiveCall();
    }


}
;

//Concrete Decorator

class JarPhone:public PhoneDecorator{
public
:
    JarPhone(BasePhone
*
 phone):PhoneDecorator(phone)
    
{
    }

    
virtual void ReceiveCall()
    
{
        PhoneDecorator::ReceiveCall();
        printf(
"Jar... "
);
    }

}
;

class ComplexPhone:public PhoneDecorator
{
public
:
    ComplexPhone(JarPhone
*
 phone):PhoneDecorator(phone)
    
{
    }

    
virtual void ReceiveCall()
    
{
        PhoneDecorator::ReceiveCall();
        printf(
"Wink... "
);
    }

}
;


//Client

int main()
{    
    BasePhone
* pphone = new
 BasePhone();
    pphone
->
ReceiveCall();
    printf(
"--------------------- "
);
    JarPhone
* p2 = new
 JarPhone(pphone);
    p2
->
ReceiveCall();
    printf(
"--------------------- "
);
    ComplexPhone
* p3 = new
 ComplexPhone(p2);
    p3
->
ReceiveCall();
    
    delete p3;
    delete p2;
    delete pphone;
    
    
return 0
;
}

运行结果:

4.应用环境 
       GOF书中给出了以下使用情况: 
1)       
在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 

2)        处理那些可以撤消的职责。  

3)        当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。  

来分析下手机的使用是属于哪种情况。首先实现了比静态继承更加灵活的方式,动态的增加功能。试想为手机的所有实现类通过继承来增加一个功能,意味着要添加不少的功能类似的子类,这明显是不太合适的。 

而且,这就避免了高层的类具有太多的特征。 


5
.透明和半透明  

       对于面向接口编程,应该尽量使客户程序不知道具体的类型,而应该对一个接口操作。这样就要求装饰角色和具体装饰角色要满足Liskov替换原则。

6
.其它 

采用Decorator模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅在他们相互连接的方式上有所不同,而不是它们的类或是它们的属性值有所不同。尽管对于那些了解这些系统的人来说,很容易对它们进行定制,但是很难学习这些系统,排错也很困难。这是GOF提到的装饰模式的缺点,你能体会吗?他们所说的小对象我认为是指的具体装饰角色。这是为一个对象动态添加功能所带来的副作用。

 

 

TIA博途WINCC的触摸屏VB脚本入门指南(嵌入式) 通过编写事件处理程序,您可以响应触摸屏元素的各种事件,并实现自定义的功能。本文将为您提供TIA博途WINCC触摸屏VB脚本的入门指南,帮助您了解基本的脚本编写和嵌入式开发。假设我们有一个名为"Button1"的按钮元素,当用户点击该按钮时,触发相应的事件处理程序,并在触摸屏上显示一条消息。然后回到触摸屏界面编辑器,在按钮元素的属性窗口中找到"按下"事件,并选择刚才创建的脚本文件作为事件处理程序。现在,当用户点击按钮时,触摸屏将执行相应的事件处理程序,并显示一条消息框,内容为"按钮被点击了! 阅读详情

相关推荐

CDO批量处理nc文件:5分钟搞定CMIP6数据双线性插值(附完整代码)

本文详细介绍了如何使用CDO工具链中的`remapbil`命令,快速实现CMIP6数据的批量双线性插值处理。通过环境配置、核心操作步骤、高级优化技巧及典型报错解决方案,帮助科研人员高效处理大规模nc文件,显著提升气象数据处理效率。

weixin_29267307的博客 292

装饰你我,成全大家——装饰模式

一、引言 装饰模式是什么?为什么有装饰模式?装饰模式怎么实现? 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 装饰模式就是用来给一个已有的类添加额外的功能。 二、实现方式 我们先来看一个需求: 简单的手机(SimplePhone)在接收来电的时候会发出声音来提醒主人;现在要将...

laowang__的博客 1012

安捷伦示波器实战指南:从基础操作到精准触发

本文详细介绍了安捷伦示波器的基础操作与高级功能,包括精准触发配置、波形分析和常见问题排查。通过实战技巧和优化建议,帮助工程师快速掌握示波器的核心功能,提升调试效率。特别适合电子工程师和测试技术人员参考使用。

weixin_30839881的博客 135

设计模式练习(9)——装饰模式

装饰模式 一、题目:简单的手机(SimplePhone)在接收到来电的时候,会发出声音来提醒主人,而现在我们需要为该手机添加一项功能,在接收来电的时候,除了有声音,还能产生震动(JarPhone),还可以得到更加高级的手机(ComplexPhone),来电时,它不仅能够发生,产生震动,而且有灯光闪烁提示,使用装饰模式来模拟手机功能的升级过程,要求绘制类图形编程模拟实现。 (1)给出装饰模式等结构视

秘密基地 6996

从零搭建:基于Matlab/Simulink与FlightGear的飞行器实时可视化仿真平台

本文详细介绍了如何从零搭建基于Matlab/Simulink与FlightGear的飞行器实时可视化仿真平台。通过环境准备、模型部署、接口配置及联合仿真等步骤,帮助用户快速掌握飞行器仿真的核心技术,实现高效的三维可视化与实时数据交互。

weixin_29100399的博客 517

5分钟搞定!用Keil MDK将STM32F103C8T6工程无缝迁移到ZET6开发板

本文详细介绍了如何在Keil MDK环境下快速将STM32F103C8T6工程迁移到ZET6开发板,涵盖硬件差异对比、工程配置调整、外设适配及编译排错等关键步骤,帮助开发者5分钟内完成工程移植,大幅提升开发效率。

weixin_30879169的博客 409

装饰模式

装饰模式 设计模式java

HH 599

装饰者模式

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

ZhaoFang 809

用 SAP Fiori Launchpad Content Manager 做目录传输:把 Catalog 变更稳稳送到目标系统

摘要:SAP Fiori项目中,目录传输是确保应用一致交付的关键环节。开发团队常遇到目录在不同系统/客户端间不一致的问题,核心在于理解Launchpad内容管理的两种作用域:系统级(/UI2/FLPCM_CONF)使用workbench请求跨系统传输,客户端级(/UI2/FLPCM_CUST)通过customizing请求按SCC4设置传输。混淆作用域会导致目录分叉,如系统级目录被客户端本地修改后形成独立副本。官方推荐使用Content Manager而非过时的Launchpad Designer,并强调手

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 105

NOC总线架构拓扑介绍

在开篇里,我们对芯片PPA有了初步的认识。下面,让我们从访存这个简单的问题开始展开介绍芯片基础概念。CPU是怎样访问内存的?简单的答案是,CPU执行一条访存指令,把读写请求发往内存管理单元。内存管理单元进行虚实转换,把命令发往总线。总线把命令传递给内存控制器,内存控制器再次翻译地址,对相应内存颗粒进行存取。之后,读取的数据或者写入确认按照原路返回。再复杂些,当中插入多级缓存,在每一层缓存都未命中的情况下,访问才会最终达到内存颗粒。

元直的博客 5296

HeadFirst 设计模式学习笔记3--装饰模式

本文已搬家至【HeadFirst 设计模式学习笔记】3 装饰模式

gnuhpc的专栏 3431

手把手教你学Simulink--基于Simulink的高增益DC-DC变换器仿真建模

特点高电压增益:可以在不使用变压器的情况下实现较大的电压升压比。适用于低电压源:如太阳能电池板、燃料电池等提供的低压直流电源。效率问题:设计时需特别注意提高效率,减少能量损失。挑战电路复杂性:通常涉及多个电感和电容,以及复杂的开关模式。元件选择:合适的元件参数对于达到理想性能至关重要。控制策略:确保高效稳定运行的同时,适应负载变化。首先明确要模拟的任务内容。实现特定的电压增益比(例如从24V升至380V)。根据预期的输入输出电压确定合适的电路拓扑和元件值。

MHD0815的博客 173

《设计模式》 装饰模式 学习笔记

“单一职责”模式: 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。 典型模式: Decorator Bridge 动机: 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),...

sunshine_505的博客 137

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java设计模式学习笔记之装饰模式

装饰模式(Decorator):动态地为对象添加一些额外的职责(功能),就增加功能来说,装饰模式比生成子类更为灵活。 场景还原今天穿什么衣服?如何搭配?两个人:皮特和萨米,他们今天要穿什么衣服呢?简单点就来说说怎么实现下面的结果吧!简单实现这还不简单?看我的:

大力哥的博客 2100

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

三、装饰模式——设计模式学习笔记

装饰模式动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

L0nginus的博客 457

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

设计模式——结构型模式之装饰模式

本人设计模式学习笔记:结构型模式之装饰模式

RichelDu8的博客 296

设计模式学习笔记——11 装饰模式

装饰模式 定义 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 优点 Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。 缺点 这种比继承更加灵活机动的特性,也...

GM. 150

设计模式学习笔记之装饰模式

/** * 装饰模式(包装器):动态地给对象添加一些额外的职责。 * 即动态扩展一个对象的功能,而不需要改变原始类代码。 * “具体组件”类和“具体装饰”类是该模式最重要的两个角色 * * 抽象组件 * @author zhenyonghe * *eg.假设系统中有一个Bird抽象类以及Bird类的一个子类:Sparrow。 *Sparrow类实现了Bird类的fly方法,使得

zyh_xf2017的博客 484

设计模式-装饰模式学习笔记

装饰模式(结构型模式) 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。[DP] 自己的理解:在不对原有类进行修改的情况下动态的对它进行扩展一些功能 优缺点 优点: 满足开闭原则 能够动态的增删功能,比继承更灵活 缺点: 会多出很多小类,增加了程序的复杂性 难以排错(多...

weixin_30363817的博客 118

设计模式学习笔记--装饰模式

定义: 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 形式: (1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。 (2) 装饰对象包含一个真实对象的引用(reference) (3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。 (4)

puppet_master的专栏 1283

设计模式学习笔记——装饰模式

定义 装饰模式——动态地将责任附加到对象上。就增加功能来说,装饰模式相比生成子类更为灵活。 使用场景 需要透明且动态地扩展类的功能时。 需要去除相关类中重复的装饰逻辑时。 UML类图 Component:是定义的一个对象接口,可以给这些对象动态地添加职责。 ConcreteComponent:组件具体实现类。该类是Component类的基本实现,也是我们装饰的具体对象。 Decorator:装饰

AndrLin 708

《设计模式》学习笔记——装饰模式

装饰模式(Decorator Pattern)指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 DecoratorPattern.h #pragma once #include&lt;iostream&gt; #include&lt;string&gt; class Car { public: virtual ...

smallerxuan的博客 5975

设计模式学习笔记(十二)装饰模式

1、动态地扩展对象的功能:可以在不修改原始对象的情况下,动态地给对象添加新的行为和功能。2、遵循开闭原则:通过对原始对象进行包装,实现了对扩展开放、对修改关闭的原则。可以轻松地新增装饰器类,而不需要修改已有的代码,提高了代码的可维护性和可扩展性。3、符合单一职责原则:装饰模式将功能划分到不同的装饰器类中,每个装饰器类只关注自己的特定功能,使得类的设计更加清晰,提高了代码的可读性和可理解性。4、避免使用子类的过多继承:通过组合多个装饰器对象来扩展功能,避免了使用过多的子类继承。

weixin_44917291的博客 389

设计模式学习笔记-装饰模式

1. 概述   动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。   原理:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。 2. 模式中的角色   2.1 抽象构建(Component):定义一个抽象...

weixin_30367945的博客 106

设计模式学习笔记(十二):装饰模式

1 概述 1.1 概述 1.2 定义 1.3 结构图 1.4 角色 2 典型实现 2.1 步骤 2.2 抽象装饰类 2.3 具体装饰类 3 实例 4 透明装饰与半透明装饰 4.1 装饰模式的问题 4.2 透明装饰模式 4.3 半透明装饰模式 5 注意事项 6 主要优点 7 主要缺点 8 适用场景 9 总结 ...

氷泠 520
上一篇: 71个做饭小技巧
下一篇: 设计模式-命令模式
tree_ch
博客等级 码龄20年 11粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值