Java设计模式之装饰者模式

装饰者模式demo 立即下载

Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。

意图:

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


设计原则:

1. 多用组合,少用继承。

利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。

2. 类应设计的对扩展开放,对修改关闭。

 

要点:

1. 装饰者和被装饰对象有相同的超类型。

2. 可以用一个或多个装饰者包装一个对象。

3. 装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。

4. 对象可以在任何时候被装饰,所以可以在运行时动态的,不限量的用你喜欢的装饰者来装饰对象。

5. 装饰模式中使用继承的关键是想达到装饰者和被装饰对象的类型匹配,而不是获得其行为。

6. 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。在实际项目中可以根据需要为装饰者添加新的行为,做到“半透明”装饰者。

7. 适配器模式的用意是改变对象的接口而不一定改变对象的性能,而装饰模式的用意是保持接口并增加对象的职责。


适用性:

以下情况使用Decorator模式

1. 需要扩展一个类的功能,或给一个类添加附加职责。

2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。

3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

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

 

优点:

1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。

2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

缺点:

1. 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。

2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。

3. 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。


关系图如下

:

Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能,代码如下:

public interface Sourceable {  
    public void method();  
}  


public class Source implements Sourceable {  
  
    @Override  
    public void method() {  
        System.out.println("the original method!");  
    }  
}  

public class Decorator implements Sourceable {  
  
    private Sourceable source;  
      
    public Decorator(Sourceable source){  
        super();  
        this.source = source;  
    }  
    @Override  
    public void method() {  
        System.out.println("before decorator!");  
        source.method();  
        System.out.println("after decorator!");  
    }  
}  


测试类:


public class DecoratorTest {  
  
    public static void main(String[] args) {  
        Sourceable source = new Source();  
        Sourceable obj = new Decorator(source);  
        obj.method();  
    }  
}  

输出:

before decorator!
the original method!
after decorator!

装饰器模式的应用场景:

1、需要扩展一个类的功能。

2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)

缺点:产生过多相似的对象,不易排错!





基于图神经网络的社交网络虚假账号检测系统 (Graph-based Fake Account Detection System, GFADS) FOLLOWSRETWEETSSHAREDCOMMENTSLIKESMENTIONSUseruser_idusernamejoin_datebioavatar_urllocationverifiedis_fakeLOAD CSV这是决定模型性能的关键环节,需结合和。XXedge_indexy新账号缺乏历史数据和丰富关系。全网图可能包含数亿节点和数十亿边,难以直接训练。社交网络是动态变化的,虚假账号策略也在不断进化。获取大规模、高质量的真实/虚假账号标注数据非常困难。 阅读详情

相关推荐

【STM32】R05D电控红外协议的美的空调遥控器

目录一、设计思路一、R05D红外协议原理1.协议手册理解2.验证时序(重点)二、硬件实现1.需要的材料2.对发射模块电路进行修改3.STM32 GPIO选择三、代码实现1.载波38kHZ实现2.R05D时序实现3.调用函数并验证 一、设计思路 通常红外遥控采用NEC传输协议,而美的空调采用的是R05D红外协议(应该是自己设计的协议),因此用一般红外编码发射模块无法直接对空调进行控制。 解决方法:获取R05D协议手册 + 用红外接收管对原有遥控器红外接收进行波形分析。 一、R05D红外协议原理 R05D电控功

weixin_42204837的博客 1万+

装饰器模式(Decorator Pattern)

装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。

FH的博客 1001

保姆级教程:SAP ABAPer如何为VF01销售发票和MIRO发票校验配置凭证替代(含AC_DOCUMENT BADI完整代码示例)

本文详细解析了SAP ABAP中通过AC_DOCUMENT BADI实现VF01销售发票和MIRO发票校验的凭证替代技术。从技术选型到BADI实施步骤,再到核心逻辑代码示例,为ABAP开发者提供了一套完整的解决方案,帮助应对财务部门复杂的业务需求。

weixin_30421809的博客 354

设计模式第7讲——装饰者模式(Decorator)

装饰者模式是一种结构型设计模式。一、什么是装饰者模式 二、角色组成 三、优缺点 四、应用场景 4.1 应用实例 4.2 java实例 五、代码实现5.0 UML类图5.1 Hero(英雄-抽象组件)5.2 BlindMonk(盲僧-具体构件)5.3 SkillDecorator(技能装饰-抽象装饰器)5.4 QDecorator(Q技能-具体装饰器)5.5 WDecorator(W技能-具体装饰器)5.6 EDecorator(E技能-具体装饰器)5.7

让~学习~成为一种习惯(橡 皮 人の技术博客) 6798

本地部署gradle

在部署CAS构建执行包时,如果按照CAS的官方命令gradlew clean build,如果系统没安装过gradle,这个步骤将会从网上下载gradle,但是进度非常慢,耗时很长。为了更快地完成项目构建,我们可以直接在本地部署好gradle,节省一点时间。

益添的博客 780

从零构建AI辅助逆向分析环境:JADX-MCP与LLM的实战集成指南

本文详细介绍了如何从零构建AI辅助逆向分析环境,通过集成JADX-MCP与LLM技术,提升Android应用逆向工程效率。文章涵盖环境搭建、插件安装、MCP服务器配置及实战案例分析,帮助开发者快速掌握AI在代码理解、漏洞挖掘和自动化文档生成中的应用。

weixin_27875131的博客 840

23种设计模式——装饰者模式

文章目录23种设计模式——装饰者模式1、装饰者模式概述2、装饰者模式的结构3、装饰者模式的实现4、装饰者模式的应用场景 23种设计模式——装饰者模式 1、装饰者模式概述 背景 有些人为了早上多睡一会,就会用方便的方式解决早餐问题。有些人早餐可能会吃煎饼,煎饼中可以加鸡蛋,也可以加香肠,但是不管怎么“加码”,都还是一个煎饼。在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框、咖啡加调料等,都是装饰器模式。 装饰者模式的定义 装饰者(Decorator)模式的定义:指在不改

万里顾一程的博客 5291

【UE5+Quest3】手部模型替换---3-0

这次手部模型替换遇到了一些小问题,不过好在是bug一个个都处理掉了,我会分开几个章节去整理。详细的视频教程可以参考油管大佬的视频手部素材放到文章末尾,自行下载使用。(仅用作学习研究,不可用于商用)

qbbmnnnnnn的博客 946

设计模式之【装饰者模式】,实现“穿衣打扮”自由原来这么简单

装饰者模式(Decorator Pattern),也称为包装模式(Wrapper Pattern)、装饰器模式,是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。在 GoF 的《设计模式》一书中,对装饰者模式是这样理解的:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式相比生成子类更灵活。装饰者模式的核心是扩展功能。使用装饰者模式可以透明且动态地扩展类的功能。装饰器模式主要解决。

秃了也弱了 2332

优化算法 | 赏金猎人优化算法(Bounty Hunter Optimizer, BHO)及其在多无人机移动边缘计算与路径规划中的应用(附matlab源代码)

移动边缘计算(Mobile Edge Computing, MEC)通过将计算资源下沉至网络边缘,有效解决了物联网终端设备计算能力不足与能耗受限的问题。无人机(Unmanned Aerial Vehicle, UAV)因其高机动性、灵活部署和广域覆盖等优势,被广泛用作MEC的移动服务器平台。多无人机辅助MEC系统的核心优化问题在于:如何在满足任务处理时延约束和无人机能量限制的前提下,联合优化无人机的三维飞行轨迹、任务卸载决策与计算资源分配,以最小化系统总能耗或最大化任务完成效率。

尘世冰封的专栏 224

如何配置SSC CANopen的excel文件

如何配置 CANOpen 的 EXCEL 文件

PI_sunyang的博客 3703

设计模式-装饰者模式(Decorator)

装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其结构。它是继承的一种替代方案,可以实现在运行时动态地扩展对象的行为,而无需修改原有代码。

m0_51176516的博客 2109

【CAN总线测试】——通讯相关诊断测试

本章主要介绍通讯相关诊断测试用例设计

LOVE135149的博客 1816

JAVA设计模式--装饰者模式详解

JAVA装饰者模式详解--代码案例、使用方式

qq_36944952的博客 1501

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

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

装饰模式——初学JAVA设计模式

文章目录一、基本概念模式角色二、简单实例实例一、变形金刚类图代码实现结果截图实例二、喜羊羊与灰太狼类图方式一:透明模式代码实现结果截图方式二:半透明模式+透明模式代码实现结果截图三、透明模式和半透明模式的区别辨析透明模式半透明模式四、小结优缺点适用场景 一、基本概念 装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。 装...

发子鸡的博客 1497

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java设计模式之装饰模式

装饰模式(Decorator Pattern)是一种结构型设计模式,用于在运行时动态地给对象添加额外的职责,而无需通过继承来扩展对象的功能。

LHR__123的博客 642

android 蓝牙通讯demo

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

java设计模式装饰者模式优点_JAVA设计模式之【装饰者模式】

JAVA设计模式之【装饰者模式】装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮、更温馨、更实用。 在软件设计中,对已有对象(新房)的功能进行扩展(装修)。 把通用功能封装在装饰器中,用到的地方进行调用。 装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系。引入装饰类,扩充新功能。 角色 抽象构件 ...

weixin_29373995的博客 202

Java装饰设计模式

1、 理解生活的装饰 生活中一些人、事、物,经过一些点缀,看起来,发生了一些改变,这些改变称为装饰,原有事物的本质内容没有发生改变。 2、         java装饰设计模式的含意 一个工作任务,经过一些点缀,表面上看起来发生一些改变,这每一次改变,就是一次装饰,这种设计方式就装饰设计模式。 例如 一行文字,可以有N多种装饰 加下划线 加粗 斜体 。。。   3、

一个有梦想的年轻人 494

Java 装饰设计模式

本文介绍了 Java 装饰设计模式的相关内容。。。

Regino的博客 391

【设计模式】深入理解 Java 设计模式之装饰者模式

通过“包装”方式动态为对象添加功能而不改变原始结构;接着详解核心结构(抽象组件、具体组件、抽象装饰者、具体装饰者)及工作原理,以咖啡添加调料为例说明动态扩展逻辑;随后提供完整Java代码实现(含抽象组件Beverage、具体组件Espresso、装饰者CondimentDecorator及Milk等);还分析了其灵活性高、符合开闭原则等优点与对象数量多等缺点,并列举Java I/O流、Swing组件等应用场景,最终总结装饰者模式在构建灵活可扩展系统中的价值。

853

Java 设计模式:装饰者模式详解

装饰者模式的核心思想是:通过将对象包装在一个装饰类中,为其动态添加职责或功能。它适合需要透明、灵活地增强对象行为的场景,如逐步增加功能或组合多种行为。

云淡风轻 1064

java设计模式-装饰设计模式

java设计模式-装饰设计模式 简单说一下(定义、举例) 什么是装饰模式:所谓装饰模式就是在不改变现有对象结构的情况下,动态的给该对象添加一些 新的功能,属于对象结构型模式。 举个栗子:比如拿我们人来说,开始不会撸码,但是当我们学习了撸码之后就会撸码了,在整 个过程中我们人的结构没有发生变化,只是多了一项新的技能 稍微夸一下(优、缺点) 装饰设计模式的优点: 灵活性:采用装饰设计模式扩展对象的功能...

Thinkao 的博客 227

JAVA设计模式——装饰设计模式

想要对已有的对象进行功能的增强时 可以定义类,将已有对象传入,基于已有的功能,提供加强功能 那么自定义的这个类就被称之为装饰类 举个简单的例子: /** * 装饰类示例 * @author Shawn·Zhang */ class Person{ public void eat() { System.out.println("吃饭"); } } //要求:增强吃饭

程序小猿——Shawn 583

java装饰者模式_Java设计模式——装饰者模式

Java设计模式——装饰者模式我们来看一个图片图片上面很清楚的显示了我们装饰者模式中的一些结构,那么我就来给大家分析一下:1、Component是抽象构建,什么意思呢,它是一个借口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象。但是我们要注意在装饰模式中,必然有一个最基本、最核心、最原始的接口或抽象类充当Component抽象构件。2、ConcreteComponent 具体构件也就是...

weixin_36318306的博客 92

JAVA设计模式——装饰者模式

JAVA设计模式——装饰者模式 一.主要概念 1.定义 以对客户端透明的方式动态扩展对象的功能,是继承关系的一个替代(继承会产生大量的子类,而且代码有冗余) 2.装饰者模式涉及的角色 抽象构件角色(Component):通常是一个抽象类或者一个接口,可以给这些对象动态的添加职责 具体构件角色(Concrete Component):是Component的子类,实现了对应的方法,它就是那个被装饰...

a158s168的博客 255

java 装饰者模式_JAVA设计模式之【装饰者模式】

JAVA设计模式之【装饰者模式】装饰模式对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮、更温馨、更实用。在软件设计中,对已有对象(新房)的功能进行扩展(装修)。把通用功能封装在装饰器中,用到的地方进行调用。装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系。引入装饰类,扩充新功能。角色抽象构件具体构件抽象装饰类具体装饰类案例一,窗体装饰1.组件类packag...

weixin_30356285的博客 167
上一篇: java设计模式之责任链
下一篇: 单例模式和工厂模式
南方的北方
博客等级 码龄14年 7粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值