Java中的装饰器设计模式

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冲击波病毒攻击-《截获网站服务器数据》

今晚课题点击【阅读原文】或长按图片【识别图中的二维码】即可

java版 modbus crc16校验 (已测试成功)_java版 ModBus CRC16校验 (已测试成功)

ModBus 的Crc16校验package testCase;public class CRC16M {static final String HEXES "0123456789ABCDEF";byte uchCRCHi (byte) 0xFF;byte uchCRCLo (byte) 0xFF;private static byte[] auchCRCHi { 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x0…

用户控件 自定义控件_新的自定义控件:TaskProgressView

用户控件 自定义控件我已经编写了一个新的自定义控件,并将其提交到ControlsFX项目。 这是一个高度专业的控件,用于显示后台任务,其当前状态和进度的列表。 这实际上是我为ControlsFX编写的第一个控件,只是出于乐趣的考虑&#xff…

C/C++码农到工程师进化之路

今晚课题长按图片【识别图中的二维码】

java菜鸟到cto 图_从菜鸟到入门,掌握 Log4j

1 简介Log4j(log for java)是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式&a…

Java中的复合设计模式

当我们必须使用对象的树状分层结构时,复合设计模式非常有用。 它使我们能够统一对待单个对象和对象的组成。 它属于结构设计模式的范畴,因为它将对象组合成树形结构以表示部分整个层次结构。 UML表示形式: 复合模式的UML表示形式如下&#…

腾讯官方游戏《陆战之王 3D坦克大战》

今晚课题长按图片【识别图中的二维码】

hazelcast入门教程_Hazelcast入门指南第4部分

hazelcast入门教程这是我的Hazelcast系列的第四部分。 如果一个人没有看到其他三个人,我建议一个人去看第1 部分 , 第2 部分和第3部分 。 记录中 日志记录是任何应用程序的重要功能,我的示例也是如此。 System.out.println可以用作告诉用户控…

《地下城与勇士歼灭贝内尔》回合格斗

今晚课题长按图片【识别图中的二维码】

java继承执行子类输出顺序_JAVA继承顺序

当使用继承这个特性时,程序是如何执行的;继承的初始化顺序1.初始化父类再初始子类2.先执行初始化对象中属性,再执行构造方法中的初始化当使用继承这个特性时,程序是如何执行的呢,也就是说我们需要关注继承的初始化顺序…

空字符串字符串不为空_当字符串为空但不为空时

空字符串字符串不为空介绍 我团队中的一名初级程序员遇到了一个有趣的错误。 我已经不止一次看到它的症状。 这篇文章是寻找什么以及如何在将来防止它。 我还将探讨该问题的不同解决方案。 病征 有问题的代码看起来做得不错。: if(trouble ! null && !tro…

网络通信协议-TCP/IP模型实战

今晚课题长按图片【识别图中的二维码】

java家具网站需求分析_基于jsp的家具销售-JavaEE实现家具销售 - java项目源码

基于jspservletpojomysql实现一个javaee/javaweb的家具销售, 该项目可用各类java课程设计大作业中, 家具销售的系统架构分为前后台两部分, 最终实现在线上进行家具销售各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类家具销售相关的实体进行管理。该家具…

hazelcast入门教程_Hazelcast入门指南第2部分

hazelcast入门教程本文是我开始使用Hazelcast (分布式内存数据库)的系列文章的继续。 如果尚未阅读第一篇文章,请单击此处 。 分布式馆藏 Hazelcast具有许多可用于存储数据的分布式集合。 以下是它们的列表: 清单 我设置 队列…

C/C++深入剖析指针机制与内存动态管理

今晚课题【长按识别图中二维码】

jedis watch Java_jedis操作redis的几种常见方式总结

Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种,这篇文章主要给大家总结了关于在java中jedis操作redis的几种常见方式,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面来一起看看吧。前言Redis是一个著…

C/C++打造Windows岁月留声机

今晚课题【长按识别图中二维码】

hazelcast入门教程_Hazelcast入门指南第1部分

hazelcast入门教程介绍 我将在Hazelcast上做一个系列。 我从Twitter了解了该产品。 他们决定跟随我,经过对他们所做工作的研究后,我决定跟随他们。 我在推特上说,Hazelcast将是分布式密码破解者的重要Struts。 这引起了一些兴趣,我…

java演出厅选票_高仿猫眼电影选座(选票)模块-b

上图看效果先:1)画座位图其实不是很难一般数据都会给坐标,将坐标对应座位画出来就可以了,主要是开场动画要设置默认大小,还有座位图的数量也不是固定的,所以在初始化座位图的时侯就默认算出了整个座位图的大小-(instan…

input发送a.jax_Java EE 7 / JAX-RS 2.0 – REST上的CORS

input发送a.jaxJava EE REST应用程序在开箱即用的开发机器上通常可以很好地运行,在该机器上,所有服务器端资源和客户端UI都指向“ localhost”或127.0.0.1。 但是,当涉及跨域部署时(当REST客户端不再与托管REST API的服务器位于同…