装饰图案是广泛使用的结构图案之一。 此模式在运行时动态更改对象的功能,而不会影响对象的现有功能。 简而言之,此模式通过包装将附加功能添加到对象。

问题陈述:

想像一下我们有一个比萨饼,该比萨饼已经用番茄和奶酪烤制的情况。 之后,您只需要记住,您需要根据客户的选择添加一些其他浇头。 因此,您需要在旅途中再添加一些配料,例如鸡肉和胡椒粉。

意图:

动态地从对象中添加或删除其他功能或职责,而不会影响原始对象。
有时需要在无法通过子类添加功能的情况下进行,因为这可能会创建子类的负​​载。

解:

因此,在这种情况下,我们不是在使用继承为对象(例如披萨)添加其他功能,而是在使用合成。 当我们不想使用继承而是使用组合时,此模式很有用。

结构体

装饰器设计模式结构

以下是“装饰器设计”模式的参与者:

  • 组件 –这是包装程序,在运行时可以承担与其相关的其他职责。
  • 具体组件 –是添加了附加功能的原始对象。
  • 装饰器 -这是一个抽象类,其中包含对组件对象的引用,并且还实现了组件接口。
  • 具体的装饰器 -它们扩展了装饰器并在Component类的顶部构建了附加功能。

例:

装饰器设计模式示例

在上面的示例中,Pizza类充当Component,BasicPizza是需要装饰的具体组件。 PizzaDecorator充当Decorator抽象类,其中包含对Pizza类的引用。 ChickenTikkaPizza是ConcreteDecorator,它为Pizza类构建了附加功能。

让我们总结一下实现装饰器设计模式的步骤:

  • 创建一个我们要装饰的BasicPizza(混凝土组件)的接口。
  • 创建一个抽象类PizzaDecorator,其中包含Pizza(decorated)接口的引用字段。
  • 注意:装饰器(PizzaDecorator)必须扩展相同的装饰(Pizza)接口。
  • 现在,我们需要在decorator的构造函数中传递要装饰的Pizza对象。
  • 让我们创建混凝土装饰器(ChickenTikkaPizza),它应该提供附加浇筑的附加功能。
  • Concrete Decorator(ChickenTikkaPizza)应该扩展PizzaDecorator抽象类。
  • 将装饰器(bakePizza())的方法重定向到装饰类的核心实现。
  • 覆盖需要更改行为的方法(bakePizza()),例如添加Chicken Tikka浇头。
  • 让客户端类通过在Concrete Component(BasicPizza)的帮助下创建Concrete Decorator(ChickenTikkaPizza)来创建Component type(Pizza)对象。
  • 简而言之:新组件=混凝土组件+混凝土装饰器

比萨披萨=新的ChickenTikkaPizza(新的BasicPizza());

代码示例:

BasicPizza.java

public String bakePizza() {return 'Basic Pizza';}

Pizza.java

public interface Pizza {public String bakePizza();
}

PizzaDecorator.java

public abstract class PizzaDecorator implements Pizza {Pizza pizza;public PizzaDecorator(Pizza newPizza) {this.pizza = newPizza;}@Overridepublic String bakePizza() {return pizza.bakePizza();}
}

ChickenTikkaPizza.java

public class ChickenTikkaPizza extends PizzaDecorator {public ChickenTikkaPizza(Pizza newPizza) {super(newPizza);}public String bakePizza() {return pizza.bakePizza() + ' with Chicken topping added';}
}

客户端程序

public static void main(String[] args) {Pizza pizza = new ChickenTikkaPizza(new BasicPizza());System.out.println(pizza.bakePizza());}

优点:

装饰器设计模式比标准继承提供了更大的灵活性。 继承还以静态方式扩展了父类责任。 但是装饰器允许以动态方式执行此操作。

退税:

代码调试可能很困难,因为此模式会在运行时添加功能。

有趣的一点:

  • 适配器模式将不同的接口插入在一起,而装饰器模式则增强了对象的功能。
  • 与装饰器模式不同,策略模式无需更改即可更改原始对象。
  • 代理模式控制对对象的访问时,装饰器模式增强了对象的功能。
  • Composite和Decorator模式都使用相同的树结构,但两者之间存在细微的差异。 当我们需要将具有相似行为的一组对象保留在另一个对象中时,可以使用复合模式。 但是,当我们需要在运行时修改对象的功能时,会使用装饰器模式。
  • Java API中有许多装饰器模式的实时示例。
    • java.io.BufferedReader;

如果我们看到了BufferedReader的构造函数,那么我们可以看到BufferedReader通过添加更多功能(例如,在reader类中不存在的readLine())包装了Reader类。

我们可以使用与上述示例相同的格式来说明客户端如何使用修饰符模式new BufferedReader(new FileReader(new File(“ File1.txt”)));

同样, BufferedInputStream是装饰对象FileInputStream的装饰器。

BufferedInputStream bs = new BufferedInputStream(new FileInputStream(new File(“ File1.txt”))));

参考: 四人帮–在Idiotechie博客上使用JCG合作伙伴 Mainak Goswami的装饰设计图案进行装饰 。

翻译自: https://www.javacodegeeks.com/2012/12/decorate-with-decorator-design-pattern.html

用装饰器设计模式装饰相关推荐

  1. 装饰着模式示例_装饰器设计模式示例

    装饰着模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原 ...

  2. java设计模式之装饰模式_Java中的装饰器设计模式

    java设计模式之装饰模式 装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模 ...

  3. lambda设计模式_使用lambda的装饰器设计模式

    lambda设计模式 随着Java中lambda的出现,我们现在有了一个新工具,可以更好地设计我们的代码. 当然,第一步是使用流,方法引用和Java 8中引入的其他简洁功能. 展望未来,我认为下一步是 ...

  4. Java中的装饰器设计模式

    装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模式的UML表示开始: Con ...

  5. 装饰器设计模式的应用

    嗨,您好! 今天,我将展示装饰设计模式的实际应用. 装饰器设计模式是一种广泛使用的设计模式,同时在运行期间处理图形,树木和动态更改. 如果您正在寻找或尝试进行递归,这也是一个不错的选择. 我喜欢它. ...

  6. 结构设计模式 - 装饰器设计模式

    结构设计模式 - 装饰设计模式 装饰器设计模式用于在运行时修改对象的功能.同时,同一类的其他实例不会受此影响,因此单个对象将获得已修改的行为.装饰器设计模式是结构设计模式之一(如Adapter Pat ...

  7. java 设计模式 示例_Java示例中的装饰器设计模式

    java 设计模式 示例 Decorator design pattern is used to modify the functionality of an object at runtime. A ...

  8. java学习--装饰器设计模式

    装饰器设计模式 例一:实现对声音的的放大功能 源码: package me.sgyz.study02;/***实现放大器对声音的的放大功能* @ 洛尘曦**/public class Decorate ...

  9. 装饰器设计模式代码套路-咖啡加奶

    装饰器设计模式具体操作: 1.抽象组件:需要装饰的抽象对象(接口或抽象父类) 2.具体组件:需要装饰的对象 3.抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法 4.具体装饰类:被装饰的对象 案 ...

最新文章

  1. 『非常重要』非矿工用户如何安全度过BCH11月算力战历史时刻!
  2. 计算机解决科学研究,近期查处科研不端行为典型案例及处理决定
  3. linux cpu占用100原因查询,如何根据查询异常时间节点和连接进而确定CPU使用率100%的原因...
  4. 数据抽象能力---适合任何行业
  5. 这些年我对微服务的理解
  6. Redis之简单动态字符串sds
  7. RpcOrtho failed: An unknown process erroroccurred.
  8. java 函数式编程应用_java8 函数式编程应用
  9. 绘制半透明矩形Gdiplus和GDI性能对比
  10. 爬取了bilibili站644w视频信息之后的故事。
  11. 如何自己搭建外卖红包平台,操作外卖CPS佣金提成实现躺赚?
  12. 计算机查看图片的打开方式,windows10电脑怎么在右键菜单打开方式添加照片查看器...
  13. js拖拽(二)仿iGoogle自定义首页模块拖拽
  14. 人工智能真正值得担心的是缺德,而不是聪明
  15. 【地球科学】常用的地理投影坐标系介绍(笔记)
  16. Treedp贪吃的九头龙详解
  17. SimpleFOC之ESP32(二)—— 开环控制
  18. 2022到2023基于PHP+微信小程序毕业设计课题参考
  19. Python 完美诠释“高内聚“概念的 IO 流 API 体系结构
  20. python 动物分类_动物有哪些分类?

热门文章

  1. wireshark tcp抓包分析_网络分析系列之八_使用Wireshark抓包
  2. 基于maven的SpringMVC+Spring+MyBatis+Log4j2的pom配置
  3. java流与文件——对象流和序列化
  4. 动态调整canvas时的问题
  5. 如何实现下拉框的绑定
  6. openshift安装_云幸福–如何在几分钟内安装新的OpenShift Container Platform 3.7
  7. mongodb上限集合_用Java创建MongoDB上限集合
  8. openshift使用_OpenShift v3:使用WildFly和MySQL的Java EE 7入门
  9. forkjoin_应用ForkJoin –从最佳到快速
  10. rest和rest ful_为什么REST如此重要