装饰器设计模式允许在运行时将附加职责或行为动态附加到对象。 它是一种结构模式,利用聚合来组合这些行为。

在本教程中,我们将学习实现装饰器模式。

UML图:


让我们从装饰器模式的UML表示开始:

ConcreteComponent类是我们希望为其在运行时添加其他行为的类。 ConcreteDecorator1ConcreteDecorator2 ,…是装饰器类,它们包含装饰给定Component的逻辑。

请注意, 抽象 Decorator'具有' 组件。 换句话说,它聚合了任何其他类型的组件,这使我们可以将一个组件堆叠在另一个组件的顶部。

此外, ConcreteComponentDecorator类都实现一个公共接口Component

示例实现:

假设我们正在销售礼品。 一旦用户选择了礼物项目,就有多种方法可以用红色或蓝色丝带,紫色或绿色礼物包装纸等装饰该礼物项目。

与其为每个可能的组合创建一个类,不如使用装饰器模式来实现它。

因此,让我们创建我们的GiftComponent接口:

 public interface GiftComponent { void pack();  } 

此外,让我们编写GiftItem类,这是GiftComponent的具体实现:

 public class GiftItem implements GiftComponent {  public void pack() { System.out.println( "Putting it in a box" ); }  } 

实现抽象装饰器:

现在,我们有一个GiftItem,我们会喜欢装饰,让我们来定义抽象GiftDecorator类:

 public abstract AbstractGiftDecorator implements GiftComponent { protected GiftComponent gift;  public AbstractGiftDecorator(GiftComponent gift) { this .gift = gift; }     public void pack() { this .gift.pack(); }  } 

礼物装饰器具有礼物组件的单个实例。 这样就可以将装饰器彼此堆叠。

创建多个装饰器:

最后,我们可以根据需要创建任意数量的自定义装饰器。

让我们创建一些礼品包装:

 public class PurpleWrapper extends AbstractGiftDecorator {  public PurpleWrapper(GiftComponent gift) { super (gift); }  public void pack() { super .pack(); System.out.println( "Purple wrapper" ); }  }   public class RedWrapper extends AbstractGiftDecorator {  public RedWrapper(GiftComponent gift) { super (gift); }  public void pack() { super .pack(); System.out.println( "Red wrapper" ); }  } 

以及几种用于进一步装饰的色带:

 public class BlueRibbon extends AbstractDecorator {  public BlueRibbon(GiftComponent gift) { super (gift); }  public void pack() { super .pack(); System.out.println( "Blue ribbon" ); }  }   public class PinkRibbon extends AbstractDecorator {  public PinkRibbon(GiftComponent gift) { super (gift); }  public void pack() { super .pack(); System.out.println( "Pink Ribbon" ); }  } 

测试我们的实施:

现在让我们测试一下实现,看看会发生什么:

 // client code  GiftComponent gift = new GiftItem();  GiftComponent giftWithPurpleWrapper = new PurpleWrapper(gift);  GiftComponent giftWithPurpleWrapperAndPinkRibbon = new PinkRibbon(giftWithPurpleWrapper);   giftWithPurpleWrapperAndPinkRibbon.pack(); 

如我们所见,我们现在可以通过链接装饰器轻松,优雅地按照我们想要的方式包装礼品。 上面的代码将打印:

 Putting it in a box  Purple Wrapper  Pink Ribbon 

结论:

装饰器设计模式使用聚合来代替纯继承。 它允许我们向对象动态添加行为。 它消除了为每种可能的组合创建单独的类的开销,从而大大减少了类的数量。

而且,它遵循单一责任原则 ,该原则规定每个班级必须准确地做一件事。 使用装饰器设计模式设计java.io.BufferedReader,java.io.FileReader类的类

翻译自: https://www.javacodegeeks.com/2019/09/decorator-design-pattern-in-java.html

Java中的装饰器设计模式相关推荐

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

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

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

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

  3. Java中的中介器设计模式-示例教程

    中介者模式是行为设计模式之一 ,因此它处理对象的行为. 中介器设计模式用于在系统中不同对象之间提供集中式通信介质. 根据GoF,中介者模式意图是: 通过封装不同对象集相互交互和通信的方式,允许松散耦合 ...

  4. Java中的中介器设计模式

    在本教程中,我们将学习一种行为模式,该行为模式将促进彼此通信的多个对象之间的松散耦合. Mediator设计模式背后的想法是拥有一个中心对象,该对象封装了一组对象之间的交互方式. 在调解器模式中,我们 ...

  5. Java中InputStream装饰器模式的大家族

    因为和输入流与之对应的还有输出流(即OutputStream),在此只针对输入流InputStream讨论. 1. 家族老大: 一说起家族中的老大,InputStream自然是当仁不让,在java的输 ...

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

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

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

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

  8. 学习笔记:设计模式-装饰器设计模式(JAVA)

    概念 装饰器设计模式,也叫包装设计模式,他是作为现有类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构. 给对象添加功能,一般两种方式,继承或者组合,将一个类的对象嵌入到另一个对象中, ...

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

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

最新文章

  1. 调用API弹出打印机属性对话框
  2. 2020 年,让 OKR 助力你稳住 flag 清单!
  3. 以太坊又一次大拥堵何去何从?深度对话美图以太坊DPoS算法实现团队
  4. [HNOI2009]最小圈 (二分答案+负环)
  5. 7-10 石子合并 (10 分)
  6. jboss 程序位置_介绍JBoss BPM Suite安装程序
  7. python 源码编译教程_python源码编译
  8. java jacoco覆盖率报错_接口测试代码覆盖率(jacoco)方案分享
  9. UI控件篇——UIPageControl及其自定义
  10. Charles监听HTTPS请求
  11. ISA server 的备份与还原
  12. 《程序员代码面试指南》第三章 二叉树问题 判断t1树是否包含t2树全部的拓扑结构...
  13. android studio for android learning (二十八) android基础知识
  14. 如何正确使用TM1652驱动共阴极数码管
  15. c盘python怎么移到d盘_怎样把C盘的所有文件移到D盘或E盘里去?
  16. 华为云服务登录显示服务器异常,云服务器异常登录应该怎么处理
  17. uni app修改android原生,iOS原生返回图标
  18. C#程序设计第三版(李春葆)第12章文件操作课后习题答案
  19. Android背景虚化的PopupWindow 可指定虚化区域
  20. 为即将的工作做准备~

热门文章

  1. nssl1211-好文章【字符串hash,map】
  2. POJ3764-The xor-longest Path【Trie(字典树)】
  3. codeforces1457 C. Bouncing Ball
  4. 【二分】买礼物的艰辛
  5. 【高精】Oliver的成绩(jzoj 2008)
  6. 【DP】剪草(jzoj 1510)
  7. HDU5833 异或方程组的初步学习
  8. Zookeeper超详细的面试题
  9. Java类加载器总结
  10. 漫画算法:判断2的乘方