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

手把手教你用STM32F103C8T6单片机,做一个即插即用的USB游戏手柄(附完整代码) 本文详细介绍了如何使用STM32F103C8T6单片机制作即插即用的USB游戏手柄,涵盖硬件搭建、HID协议解析及完整代码实现。通过深入讲解USB HID协议的七大关键描述符,帮助开发者快速掌握嵌入式USB设备开发技巧,打造个性化游戏控制器。 阅读详情
 
设计模式学习笔记(十)——Decorator装饰模式

Decorator装饰模式是一种结构型模式,它主要是解决:“过度地使用了继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀(多继承)。继承为类型引入的静态特质的意思是说以继承的方式使某一类型要获得功能是在编译时。所谓静态,是指在编译时;动态,是指在运行时。

GoF《设计模式》中说道:动态的给一个对象添加一些额外的职责。就增加功能而言,Decorator模式比生成子类更为灵活。

下面来看看Decorator模式的结构:



看这个结构好像不是很明白,下面我根据代码讲解一下这个结构。我想了一个场景:我们现在用的手机功能很多,我就用Decorator模式实现一下对某个手机的GSP和蓝牙功能扩展。

首先,我们需要一个手机的接口或者是抽象类,我这里就用抽象类来实现,代码如下:

public abstract class AbstractCellPhone

    {

        public abstract string CallNumber();

        public abstract string SendMessage();

}

AbstractCellPhone也就是结构图中的Component,然后,我再来实现Nokia和Moto的手机类,这类要继承AbstractCellPhone,也就是图中ConcreteComponent类要继承Component,实现代码如下:

public class NokiaPhone : AbstractCellPhone

    {

        public override string CallNumber()

        {

            return "NokiaPhone call sombody";

        }

 

        public override string SendMessage()

        {

            return "NokiaPhone send a message to somebody";

        }

    }

 

    public class MotoPhone : AbstractCellPhone

    {

        public override string CallNumber()

        {

            return "MotoPhone call sombody";

        }

 

        public override string SendMessage()

        {

            return "MotoPhone send a message to somebody";

        }

 }   

接下来我需要一个Decorator接口或者抽象类,实现代码如下:

public abstract class Decorator:AbstractCellPhone

    {

        AbstractCellPhone _phone;

 

        public Decorator(AbstractCellPhone phone)

        {

            _phone = phone;

        }

 

        public override string CallNumber()

        {

            return _phone.CallNumber();

        }

 

        public override string SendMessage()

        {

            return _phone.SendMessage();

        }

  }

正如结构图中,这个Decorator即继承了AbstractCellPhone,又包含了一个私有的AbstractCellPhone的对象。这样做的意义是:Decorator类又使用了另外一个Component类。我们可以使用一个或多个Decorator对象来“装饰”一个Component对象,且装饰后的对象仍然是一个Component对象。在下来,我要实现GSP和蓝牙的功能扩展,它们要继承自Decorator,代码如下:

public class DecoratorGPS : Decorator

    {

        public DecoratorGPS(AbstractCellPhone phone)

            : base(phone)

        { }

 

        public override string CallNumber()

        {

            return base.CallNumber() + " with GPS";

        }

 

        public override string SendMessage()

        {

            return base.SendMessage() + " with GPS";

        }

    }

 

    public class DecoratorBlueTooth : Decorator

    {

        public DecoratorBlueTooth(AbstractCellPhone phone)

            : base(phone)

        { }

 

        public override string CallNumber()

        {

            return base.CallNumber() + " with BlueTooth";

        }

 

        public override string SendMessage()

        {

            return base.SendMessage() + " with BlueTooth";

        }

 }

最后,用客户端程序验证一下:

static void Main(string[] args)

        {

             AbstractCellPhone phone = new NokiaPhone();

            Console.WriteLine(phone.CallNumber());

            Console.WriteLine(phone.SendMessage());

            DecoratorGPS gps = new DecoratorGPS(phone);     //add GSP

            Console.WriteLine(gps.CallNumber());

            Console.WriteLine(gps.SendMessage());

            DecoratorBlueTooth bluetooth = new DecoratorBlueTooth(gps); //add GSP and bluetooth

            Console.WriteLine(bluetooth.CallNumber());

            Console.WriteLine(bluetooth.SendMessage());

            Console.Read();

     }

执行结果:

NokiaPhone call sombody

NokiaPhone send a message to somebody

NokiaPhone call sombody with GPS

NokiaPhone send a message to somebody with GPS

NokiaPhone call sombody with GPS with BlueTooth

NokiaPhone send a message to somebody with GPS with BlueTooth

 

从执行的结果不难看出扩展功能已被添加。最后再说说Decorator装饰模式的几点要点:

1、通过采用组合、而非继承的手法,Decorator模式实现了在运行时动态的扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”。

2、Component类在Decorator模式中充当抽象接口的角色,不应该去实现具体的行为。而且Decorator类对于Component类应该透明——换言之Component类无需知道Decorator类,Decorator类是从外部来扩展Component类的功能。

3、Decorator类在接口上表现为is-a Component的继承关系,即Decorator类继承了Component类所具有的接口。但在实现上又表现为has-a Component的组合关系,即Decorator类又使用了另外一个Component类。我们可以使用一个或多个Decorator对象来“装饰”一个Component对象,且装饰后的对象仍然是一个Component对象。(在这里我想谈一下我的理解:当我们实例化一个Component对象后,要给这个对象扩展功能,这时我们把这个Component对象当作参数传给Decorator的子类的构造函数——也就是扩展方法的功能类。对于引用类型传参时,实际上只是传递对象的地址,这样,在功能扩展是,操作的应该是同一个对象)

4、Decorator模式并非解决“多子类衍生的多继承”问题,Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。Decorator是在运行时对功能进行组合。

DeepSeek提示词实战:从零到百的AI角色扮演指南(附100+场景模板) 本文提供了一份详尽的DeepSeek提示词实战指南,重点讲解AI角色扮演的核心技巧。通过“角色扮演四要素法”和五大核心场景模板,帮助用户从零开始掌握如何设计高质量提示词,有效提升AI输出的深度与精度,并附赠100+实用场景模板供参考。 阅读详情

相关推荐

Android应用隐私合规自动化检测:Frida与Camille实战指南

在移动应用安全与隐私合规领域,动态代码插桩技术已成为核心检测手段。其原理是通过运行时注入,实时监控和修改应用行为,从而绕过传统静态分析的局限。这项技术的核心价值在于能够精准捕获应用在运行时的敏感数据调用与网络传输行为,为隐私合规审计、安全测试提供直接证据。在实际应用场景中,它尤其适用于自动化检测违规收集个人信息、追踪数据流向等任务。本文聚焦于利用Frida这一动态插桩框架,结合Camille隐私合规检测工具集,构建自动化监控环境。通过注入JavaScript代码,实现对Android敏感API(如获取设备标

weixin_34254464的博客 388

设计模式——装饰模式

**题目:**简单的手机(SimplePhone)在接收到来电的时候,会发出声音来提醒主人,而现在手机添加一项功能,在接收来电的时候,除了有声音还能产生振动(JarPhone);还可以得到更加高级的手机(ComplexPhone),来电时它不仅能够发声,产生振动,而且有灯光闪烁提示。现用装饰模式来模拟手机功能的升级过程,要求绘制类图并编程模拟实现。 类图: 代码部分: 1、 package simplePhone; /** * 抽象手机构件类:抽象构件类 * @author 9986 * */ p

Cici$的博客 2507

思科—OSPF多区域配置实验

实验目的:配置OSPF多区域,使得不同网段的PC互相ping通。 网络拓扑如下: R0的配置 Router>en Router#conf t Router(config)#int g0/1 Router(config-if)#ip add 192.168.1.1 255.255.255.0 Router(config-if)#no shut Router(config-if)#exit Router(config)#int g0/0 Router(config-if)#ip add 192.168.

m0_46237205的博客 1万+

【设计模式学习笔记十】【结构型模式】【装饰模式(Decorator)】

装饰模式:动态的给一个对象添加一些额外的职责。就新增功能来说,Decorator模式相比生成子类更为灵活。 1)能够画出这个设计模式的架构框图; 2)能够根据架构框图写出对应的伪代码; 3)这个模式的应用场景,主要优缺点。

seaicelin的博客 703

IPD的分析工具与模型(十六)CBB公用基础模块管理实现资源共享,缩短开发周期

CBB流程的开发环节,基于CBB规划中所识别和设计的CBB,进行CBB的详细设计(包括参数设计和接口设计),并最终实现CBB的落地开发。作为特殊类型的技术构件,CBB的开发流程,可沿用技术开发中的构件开发流程,具体包括概念、计划、开发和迁移等步骤,具体可参见前文的相关介绍。有了蓝图与架构设计,落地实施是关键攻坚。具体工作内容包括:具体工作内容包括:a. 以相似性、聚类、相对独行性、可组合、可扩展性、可维护性等原则为指导,按照产品的功能特征和业务类型,聚焦零散的功能点,形成功能模块,实现产品功能模块的划分;

corgi2020的博客 2000

手把手教你用LTspice仿真扬声器阻抗曲线(附Dayton/Focal型号库)

本文详细介绍了如何使用LTspice仿真软件构建高精度扬声器模型,包括获取Dayton/Focal等厂商的SPICE模型库、模型导入方法、阻抗测试电路搭建及仿真设置。通过手把手教学,帮助读者快速掌握扬声器阻抗曲线的仿真技术,提升音响系统设计效率。

weixin_26897585的博客 388

设计模式——装饰模式(Decorator)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.youkuaiyun.com/zhshulin 1、概念         装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。         但是纯粹的装饰模式很难找到,大多数的装饰模式的实现

在路上 5万+

【论文翻译】VIT:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

VIT摘要介绍相关工作模型VISION TRANSFORMER (VIT)微调和高分辨率实验结论 摘要 虽然Transformer架构在自然语言处理任务中已经成为事实标准,但是它在计算机视觉领域的应用仍然受限。在视觉领域,注意力要么和卷积网络结合使用,要么替换卷积网络中的某些部分,同时保持整体结构不变。本文表明对CNNs的依赖不是必要的,纯转换器(pure transformer)直接应用于图像块(image patches)序列在图像分类任务中能发挥很好的作用。当对大量数据进行预训练并把它转移到多个中型或

栗子菜菜 1846

设计模式:装饰模式(Decorator)

设计模式:装饰模式(Decorator)

ProgramNovice的博客 1782

2023 年全国网络安全行业职业技能大赛-电子数据取证分析师-决赛WP_2023网络安全行业赛取证

数据库取证工具里面可以恢复删除掉的数据带红叉的就说删除过的,game库下面announcement_detail表里面update_time字段使用sql语句时间戳最大为1513243355转换时间为2017-12-14 17:22:35。

2401_89791684的博客 2092

【异常】Claude Code 在 Windows CMD 中出现重影现象的排查与解决

Windows CMD运行Claude Code时出现文字重影、乱码等问题,原因是传统CMD对现代ANSI终端控制序列支持不足。解决方案包括:1)推荐安装Windows Terminal(完全支持ANSI标准);2)使用PowerShell 7;3)优化CMD设置(启用虚拟终端、UTF-8编码);4)关闭Claude Code视觉特效。建议优先使用Windows Terminal以获得最佳体验,这是最彻底的解决方案。其他方案仅能部分改善或缓解问题。

奶爸的编程之路,也就一周冷个三天 1958

【C++设计模式之Decorator装饰模式】

Decorator装饰模式是一种动态扩展对象功能的设计模式,通过组合而非继承来增加对象的职责,避免了继承带来的类膨胀问题。该模式的核心思想包括动态扩展、透明性和组合优于继承。

weixin_43488529的博客 1187

Python 神经计算实训 实训答案分享

【代码】Python 神经计算实训 实训答案分享。

2403_89314916的博客 346

Java设计模式 十 装饰模式 (Decorator Pattern)

抽象组件定义通用接口,表示所有文本处理组件的公共行为。

空 1135

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

设计模式——装饰模式详解

装饰模式动态地给一个对象添加一些额外的功能,相对于继承的方式,更加灵活。 装饰模式经常被误认为是代理模式。装饰模式是以对客户透明的方式扩展对象的功能,是继承关系的一个替代方案。而代理模式则是给一个对象提供一个代理对象,并由代理对象来控制原有对象的引用。 前者重在增加功能,后者重在对代理对象施加控制,不是对对象本身功能的增强。...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

设计模式-装饰模式-decorator_pattern

装饰者同实际对象有相同的接口,并持有一个指向实际对象的引用,在调用实际对象的方法前后,可以执行额外的功能。在需要动态扩展功能时,装饰模式是一种有效的设计模式,但应该谨慎使用,避免上述问题的出现。装饰模式通过将对象包装在装饰者类中来动态地添加功能,这使得装饰者可以与原始对象无缝集成,同时保持高度的灵活性和可扩展性。在需要遵循开闭原则(对扩展开放,对修改关闭)的场景中,装饰模式允许在不修改现有代码的基础上扩展功能。在应用程序中,可以使用装饰模式为方法添加性能监测功能,以统计方法的执行时间。

wesigj的博客 1790

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

设计模式之八 --- 装饰模式(Decorator)

【1】基本概念           装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 【2】简单分析           我们先来看下该设计模式的UML结构图 上图是Decorator 模式的结构图,让我们可以进行更方便的描述: Component是定义一个对象接口,可以给这些对象动态地添加职责。 Conc

Android-Idea 1万+

【详解】JAVA设计模式装饰模式(Decorator)

首先,定义一个接口或抽象类,这个接口或抽象类描述了基本的行为。

牛肉胡辣汤 1493

设计模式之七—装饰模式(Decorator Pattern)

装饰模式是一种结构型设计模式,它动态地将责任附加到对象上。装饰模式提供了比继承更有弹性的替代方案,用于扩展对象的功能。装饰模式提供了一种灵活的替代继承的方式,通过组合对象来扩展功能。需要动态、透明地给对象添加职责需要避免使用继承导致的类爆炸问题需要遵循开闭原则,在不修改现有代码的情况下扩展功能在Java中,装饰模式被广泛应用于I/O流处理、GUI组件装饰等场景。正确使用装饰模式可以提高代码的灵活性和可维护性,但也需要注意避免过度使用导致的系统复杂性增加。

技术交流,一起进步 677
上一篇: 设计模式学习笔记(九)——Composite组合模式
下一篇: 设计模式学习笔记(十五)——结构型模式总结
zhy05
博客等级 码龄21年 21粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值