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

.NET 设计模式—装饰器模式(Decorator Pattern) 装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你在不改变对象接口的前提下,动态地将新行为附加到对象上。这种模式是通过创建一个包装(或装饰)对象,将要被装饰的对象包裹起来,从而实现对原有对象功能的增强和扩展。 阅读详情

装饰器模式(Decorator)

在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰模式来实现。

装饰器模式的定义与特点
  • 装饰器(Decorator)模式的定义:
    指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
  • 装饰器(Decorator)模式的优点:
    1.采用装饰器模式扩展对象的功能比采用继承方式更加灵活。
    2.可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。
  • 装饰器(Decorator)模式的缺点:
    装饰器模式增加了许多子类,如果过度使用会使程序变得很复杂。
装饰器模式的结构与实现

1. 模式的结构
装饰器模式主要包含以下角色:

  1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  2. 具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

装饰模式的结构图如图 1 所示。
图1 装饰器模式的结构图
1. 模式的实现
装饰器模式的实现代码如下:

package decorator;
public class DecoratorPattern
{
    public static void main(String[] args)
    {
        Component p=new ConcreteComponent();
        p.operation();
        System.out.println("---------------------------------");
        Component d=new ConcreteDecorator(p);
        d.operation();
    }
}
//抽象构件角色
interface  Component
{
    public void operation();
}
//具体构件角色
class ConcreteComponent implements Component
{
    public ConcreteComponent()
    {
        System.out.println("创建具体构件角色");       
    }   
    public void operation()
    {
        System.out.println("调用具体构件角色的方法operation()");           
    }
}
//抽象装饰角色
class Decorator implements Component
{
    private Component component;   
    public Decorator(Component component)
    {
        this.component=component;
    }   
    public void operation()
    {
        component.operation();
    }
}
//具体装饰角色
class ConcreteDecorator extends Decorator
{
    public ConcreteDecorator(Component component)
    {
        super(component);
    }   
    public void operation()
    {
        super.operation();
        addedFunction();
    }
    public void addedFunction()
    {
        System.out.println("为具体构件角色增加额外的功能addedFunction()");           
    }
}

程序运行结果如下:

创建具体构件角色
调用具体构件角色的方法operation()
---------------------------------
调用具体构件角色的方法operation()
为具体构件角色增加额外的功能addedFunction()
装饰模式的实例

我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。RedShapeDecorator 是实现了 ShapeDecorator 的实体类DecoratorPatternDemo,我们的演示类使用 RedShapeDecorator 来装饰 Shape 对象。
类图
1. 创建一个接口:Shape.java

public interface Shape {
   void draw();
}

2. 创建实现接口的实体类。Rectangle.java、Circle.java

public class Rectangle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Shape: Rectangle");
   }
}

public class Rectangle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Shape: Rectangle");
   }
}

3. 创建实现了 Shape 接口的抽象装饰类。ShapeDecorator.java

public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;
 
   public ShapeDecorator(Shape decoratedShape){
      this.decoratedShape = decoratedShape;
   }
 
   public void draw(){
      decoratedShape.draw();
   }  
}

4. 创建扩展了 ShapeDecorator 类的实体装饰类。RedShapeDecorator.java

public class RedShapeDecorator extends ShapeDecorator {
 
   public RedShapeDecorator(Shape decoratedShape) {
      super(decoratedShape);     
   }
 
   @Override
   public void draw() {
      decoratedShape.draw();         
      setRedBorder(decoratedShape);
   }
 
   private void setRedBorder(Shape decoratedShape){
      System.out.println("Border Color: Red");
   }
}

5. 使用 RedShapeDecorator 来装饰 Shape 对象。DecoratorPatternDemo.java

public class DecoratorPatternDemo {
   public static void main(String[] args) {
 
      Shape circle = new Circle();
      ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
      ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
      //Shape redCircle = new RedShapeDecorator(new Circle());
      //Shape redRectangle = new RedShapeDecorator(new Rectangle());
      System.out.println("Circle with normal border");
      circle.draw();
 
      System.out.println("\nCircle of red border");
      redCircle.draw();
 
      System.out.println("\nRectangle of red border");
      redRectangle.draw();
   }
}

执行程序,输出结果:

Circle with normal border
Shape: Circle

Circle of red border
Shape: Circle
Border Color: Red

Rectangle of red border
Shape: Rectangle
Border Color: Red
装饰器模式的应用场景

前面讲解了关于装饰模式的结构与特点,下面介绍其适用的应用场景,装饰模式通常在以下几种情况使用。

  • 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生大量的子类。
  • 当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,而采用装饰模式却很好实现。
  • 当对象的功能要求可以动态地添加,也可以再动态地撤销时。

装饰模式在java语言中的最著名的应用莫过于 Java I/O 标准库的设计了。例如,InputStream 的子类 FilterInputStream,OutputStream 的子类 FilterOutputStream,Reader 的子类 BufferedReader 以及 FilterReader,还有 Writer 的子类 BufferedWriter、FilterWriter 以及 PrintWriter 等,它们都是抽象装饰类。

装饰器模式的扩展

装饰模式所包含的 4 个角色不是任何时候都要存在的,在有些应用环境下模式是可以简化的,如以下两种情况。
(1) 如果只有一个具体构件而没有抽象构件时,可以让抽象装饰继承具体构件,其结构图如下图所示。
只有一个具体构件的装饰模式
(2) 如果只有一个具体装饰时,可以将抽象装饰和具体装饰合并,其结构图如下图所示。
 只有一个具体装饰的装饰模式

Unity游戏Google Play闪退?可能是这个隐藏设置惹的祸(附完整解决方案) 本文深度解析Unity游戏在Google Play上出现闪退的疑难问题,指出其根源可能在于Google Play后台的“应用完整性”设置与游戏原生库的冲突。文章提供了从崩溃日志分析、本地与线上版本对比测试,到调整Unity构建设置、审查第三方插件以及优化分发包配置的系统性排查与根治方案,帮助开发者彻底解决这一隐蔽问题。 阅读详情

相关推荐

LLC同步整流实战:从驱动时序到调试仿真,效率提升与避坑指南

同步整流技术是提升开关电源效率的关键手段,尤其在LLC谐振变换器中,通过低导通电阻MOSFET替代二极管可显著降低副边整流损耗。然而,驱动时序、电流过零检测及轻载模式切换是工程实践中的核心难点。从Vds检测原理到死区调节,再到仿真与实测验证,工程师需掌握完整的调试方法论。该技术广泛应用于通信电源、服务器电源及车载DC/DC,合理设计LLC同步整流方案能实现满载效率提升约1.8个百分点,同时优化热分布。本文以600W半桥LLC样机为线索,深入分析工作模态、驱动芯片选型、波形判断与仿真模型搭建,为电源设计提供可

weixin_29165465的博客 297

设计模式----装饰者模式

装饰者模式是对客户透明的方式,动态的给对象附加更多的功能和责任,就是不用创建更多的子类的情况下就可以将对象的功能进行扩展。 优点:避免了子类爆炸的问题,解决了对于一个产品功能动态扩展的问题,其UML类图如下所示 构成: 1、抽象构件(Component) 定义对象的接口,用来给对象增加新的功能 2、具体构件(ConcreteComponent) 定义具体的构件对象,实现了抽象构件中声明的方法,是被装饰的对象,也是给这个对象添加新的功能 3、抽象装饰器(Decorator) 抽象装饰器是.

sky_dianziaihaozhe的博客 322

【实战指南】WinPE环境下360系统急救箱的病毒查杀全流程解析

本文详细解析了在WinPE环境下使用360系统急救箱进行病毒查杀的全流程。从制作WinPE启动盘到进入PE环境,再到360急救箱的深度使用和系统修复,提供了实用技巧和常见问题解决方案,帮助用户高效清除顽固病毒。

weixin_28568819的博客 537

装饰者模式

一、装饰者模式当需要对已有的对象进行功能增强时,可以定义类(装饰类),将已有的对象传入,基于已有的功能,并提供加强功能,那么自定义的类成为装饰类1.装饰模式和继承的区别:相同点:装饰模式与继承关系的目的都是要扩展对象的功能不同点:代码结构比继承更加简洁饰模式可以提供比继承更多的灵活性(意味着可以向装饰器的构造方法传入被装饰类的子类对象)2.继承是类与类或者接口与接口之间最常见的关系;继承是一种is...

Jones0524的博客 370

ENVI哨兵一号数据处理

使用ENVI+SarScape处理哨兵数据

Rjjjjj11的博客 2万+

EM算法求解混合伯努利模型

本文记录了EM算法求解混合伯努利分布的推导,并提供了matlab实验代码。

霁月难逢 彩云易散 6971

设计模式之装饰器模式详解

设计模式之装饰器模式详解 文章目录设计模式之装饰器模式详解一、什么是装饰者模式二、门面模式的角色组成四、门面模式示例五、门面模式优缺点 一、什么是装饰者模式 装饰器模式(Decorator Pattern) 也称为包装模式(Wrapper Pattern) 是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。装饰器模式的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能。 二、门面模式的角色组成 外观角色(Facade):

weixin_45538589的博客 2万+

企业级AI Agent平台建设方案

本报告将深入剖析构成一个顶级AI Agent平台的各个功能层面,为构建者提供一份全面的战略蓝图。

分享AI和大数据领域的知识和研究 1582

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

1 定义 装饰器(Decorator)模式,也称为包装(Wrapper)模式,是继承关系的一种替代方案。指在不改变对象结构的情况下,动态的给对象添加一些功能。 2 优缺点 2.1 优点 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果 装饰器模式完全遵守开闭原则 2.2 缺点 装饰器模式会增加许多子类,过度使用会增加程序得复杂性。 3 装饰器模式的结构与实现 装饰器模式的类图如下所示:

honor_zhang的博客 5279

通俗理解Xgboost

为了简化计算,XGBoost采用了一阶导数(梯度)和二阶导数(Hessian)来近似损失函数的变化,从而推导出叶子节点值的更新公式。其中 z 就是所有树的叶子节点分数之和。通过这两个正则化项,XGBoost能够在优化目标函数时,不仅考虑损失函数的最小化,还考虑了模型的复杂度,从而达到更好的泛化性能。正则化项通常包括两个部分:一个是与叶子节点数量相关的项,另一个是与叶子节点输出值大小相关的项。通过这种方式,XGBoost能够有效地计算出每个叶子节点的值,同时通过正则化项来平衡模型的复杂度和泛化能力。

金融风控笔记 751

基于STM32单片机设计的红外测温仪(带人脸检测)_34

当前设计的这款红外非接触式测温仪由测温硬件+上位机软件组合而成,主要用在地铁、车站入口等地方,可以准确识别人脸进行测温,如果有人温度超标会进行语音提示并且保存当前人脸照片。

8770

C++ 设计模式-装饰模式

介绍装饰模式和使用

wangdamingll的博客 873

【Agent从入门到实践】40 容错优化:异常处理、重试机制、降级策略

各位小伙伴,咱们的多Agent框架一路优化到现在,决策快、执行效率高、资源用得省,看似啥都行,但只要一遇到网络波动、工具故障、数据异常调用web_search工具时网络超时,整个检索任务直接失败,写作Agent没数据可用向量库连接异常,向量检索直接崩掉,依赖检索结果的Agent全趴窝单个Agent执行出错,整个并行任务流程直接中断,前功尽弃高并发下部分工具调用失败,框架没有备用方案,只能返回任务失败说白了,咱们之前的框架只有正常执行逻辑,没有异常兜底逻辑。

人工智能AI技术 910

设计模式之装饰器模式(Decorator Design Pattern)

装饰器模式是常用设计模式之一,装饰器模式与代理模式非常像,区别是代理模式是原始功能上附加功能,而装饰器模式是增强原始功能。 代理模式:我(代理)不是你(原始类),我只是代表你的(部分或全部)能力,不会改变你的能力; 装饰器模式:我(装饰器)就是你(原始类),我是你的伪装,不仅有你的全部能力,还可以改变你的能力; //人类 interface HumanBeing { //速度 public void velocity(); //反应 public void reaction();

xjj1314的专栏 460

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

设计模式-08装饰器模式Decorator Pattern

装饰器模式是一种动态扩展对象功能的结构型设计模式。它通过将对象包装在装饰器类中,而非使用继承,实现了灵活的功能扩展。该模式适用于需要动态添加或撤销职责的场景,尤其当子类继承不适用时。典型实现包含组件接口、具体组件和装饰器类,通过多层包装实现功能叠加。示例展示了咖啡店场景,通过不同装饰器组合可灵活定制咖啡价格和描述。这种模式保持了类的单一职责原则,同时提供了比继承更灵活的功能扩展方式。

d3y1`5 81_09 1264

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Unity 设计模式:装饰器模式Decorator Pattern的应用

深入理解装饰器模式Decorator Pattern的应用的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与最佳实践。本文属于《Unity工程师成长之路教程》Unity 设计模式篇(第十一篇)。

输出倒逼输入,写作驱动成长。 1万+

假人有限元模型

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

设计模式 15 Decorator Pattern 装饰器模式

Decorator Pattern 装饰器模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或职责,而无需修改对象的源代码。这种模式通过创建一个包装对象,也称为装饰器,来包裹原始对象,装饰器对象与原始对象有相同的接口,因此可以在不改变客户端代码的情况下,增加或修改对象的功能。装饰器模式的优点包括:动态地给对象添加新的行为,而无需修改对象的源代码或继承结构。可以独立地增加对象的功能,因为每个装饰器都是独立的类。保持了类的单一职责,使得代码更易于维护和扩展。

jxusthusiwen的专栏 876

【设计模式】——装饰器模式(Decorator Pattern)

在软件开发中,设计模式是解决常见问题的最佳实践。装饰器模式(Decorator Pattern),又称为包装器模式(Wrapper Pattern),是一种结构型设计模式,它允许在不改变原有对象结构的基础上,动态地给对象添加一些新的职责(即增加其额外功能)。这种模式在C++中的应用广泛,特别适合于需要灵活扩展对象功能的场景。

J^T的博客 2034

23种设计模式之装饰器模式(Decorator Pattern)

本篇文章将23种设计模式中的装饰器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

设计模式之装饰器模式 (Decorator Pattern)

装饰器模式是一种动态扩展对象功能的设计模式,通过嵌套包装替代继承,实现功能的灵活组合。其核心是将功能扩展从"纵向继承"转变为"横向包装",每个装饰器持有被装饰对象并在调用前后添加行为。典型应用包括Python的@decorator语法和Java的IO流包装。该模式解决了继承导致的类爆炸问题,支持运行时动态配置,但会牺牲对象身份明确性并增加调试复杂度。适用于需要动态、可撤销添加职责且功能可任意组合的场景,体现了开闭原则的思想。

goodparty的专栏 1956

【设计模式】深入解析装饰器模式(Decorator Pattern)

装饰器模式详解

qq_59344127的博客 1969

设计模式教程:装饰器模式(Decorator Pattern)

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

遇见伯灵说的博客 1188

【设计模式】装饰器模式( Decorator Pattern)

​ 装饰器(Decorator)模式也可叫包装模式(Wrapper Pattern) ,是为已有功能动态添加更多功能的一种方式。装饰器通过新建装饰类,用来包装原有的类,在保证原有类结构完整的情况下添加新功能。此模式将原有类当做组件,或者为原有类新建一个抽象类当做组件接口,原有类和装饰类通过继承该抽象类来实现关联。当需要使用装饰功能时只需要让装饰类包装原有类的对象即可完成装饰。

櫆溟的博客 1306

设计模式--装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你在运行时动态地将行为添加到对象中。在装饰器模式中,这些新的行为通常对应于添加的责任。Decorator是抽象装饰类,它维护了一个对组件对象的引用,并定义了一个与组件接口一致的接口。ConcreteDecorator是具体装饰类,它在装饰类的基础上增加了新的行为。在这个例子中,Component是抽象组件,定义了一个operation接口。通过这种方式,我们可以动态地给对象添加新的行为,而不需要修改原始类的代码。

翔云 849

设计模式|装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变原始对象的基础上,动态地给对象添加新的功能或责任。这种模式是通过创建一个包装对象,也就是装饰器,来包裹真实的对象,然后在装饰器中添加新的行为或功能。这样,就可以在运行时动态地修改对象的行为。

weixin_44435110的博客 965

java decorator pattern,设计模式十 之 装饰器模式(Decorator Pattern)

装饰器模式(Decorator Pattern)装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功...

weixin_33603105的博客 143
上一篇: 2010软件设计师考试(英语部分)
下一篇: 2011软件设计师考试(英语部分)
吴声子夜歌
博客等级 码龄9年 2688粉丝 2268原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值