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

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

java设计模式之装饰模式

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

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

相关文章

qml 自定义消息框_Qt qml 自定义消息提示框

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/a844651990/article/details/78376767Qt qml 自定义消息提示框QtQuick有提供比较传统的信息提示框Mes…

计算机器内存数量+引入和显示ARDS成员

【1】README 1.1) 本代码在于读取内存中多个 内存段的地址范围描述符结构体(ARDS),有多少个内存段可以用;1.2) source code and images in the blog from orange’s implemention of a os 1.3)…

Maven Java 项目中,pom.xml 文件的依赖标签作用解读(<dependency/>)

该标签会让 Maven 自动到本地仓库或远程仓库去查找构件,找到后会自动创建项目级别的资源库,然后会将资源库同步到依赖此构件的模块的 classpath 中,也就是模块的依赖库中,如下图所示: classpath 就是类路径&#xff0…

自我审视记录本_春天重新审视战略模式

自我审视记录本这篇博客文章希望展示另一种方法,该方法如何通过依赖注入实现策略模式。 作为DI框架,我选择Spring框架 首先,让我们看一下如何以经典方式实施策略模式。 作为起点,我们有一个HeroController ,应该在He…

如何用python编程机器人培训_机器人编程怎么入门?

打个广告(更新于2017.03.30)坐标上海,上海微创医疗器械(集团)有限公司,机器人子公司在研产品主要是腹腔镜手术机器人、骨科手术机器人等招聘:机器人算法工程师软件工程师机器人控制工程师具体岗位要求,请移步另一个回答&#xff1…

Struts2的校验器详解/验证框架详解/校验框架详解

文章目录简介使用校验器步骤演示案例常用校验器requiredrequiredstringstringlengthregexintdoublefieldexpressionemailurldateconversionvisitorexpression参考简介 Struts2 的校验器是在后端对前端提交的数据进行校验,在调用 Action 的指定方法前会先调用校验器…

os引导程序boot 在根目录区寻找os加载程序文件loader 对应的根目录条目

【0】README 0.0) source code from orange’s implemention of a os and for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/boot.asm0.1)本代码仅用于在 根目录区条目中寻找 与 boot代码定义的LoaderFileName…

lambda层保存模型出错_保存您的lambda,以备不时之需-保存到文件

lambda层保存模型出错介绍 简短的帖子,描述了如何将Java lambda持久化到文件中以在不同的过程中重复使用。 序列化Lambda Java 8中引入的Lambda使函数成为Java语言的一等公民(几乎)。 他们不需要专门的类来保存函数。 但是,这是如…

angular4更改表单中显示的值_angular4 Form表单相关

ng4中,有两种方式去声明一个表单一:Template-Driven Forms - 模板驱动式表单 [引入FormsModule]1.ngForm赋值[可以方便的获取表单的值]nameusername[(ngModel)]login.usernamerequired>Name is required.2.ngModel绑定[ngModel会自动关联表单控件na…

A20地址线问题

【0】README text description from Zhaojiong’s perfect analysis of Linux kernel . 【1】A20地址线问题(干货来了) 1981年8月,IBM公司最初推出的个人计算机IBM PC 使用的CPU 是 Intel 8088。在该微机中地址线只有20根(A0~A1…

java观察者设计模式_Java中的观察者设计模式

java观察者设计模式在本教程中,我们将讨论Observer设计模式。 观察者模式有两个主要方面- 主题和观察者 。 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,即依赖于一个特定对象( 主体&#xff0…

MacOS好用的截图工具

iShot 可以截取长图 高级功能需要付费 jietu 可以截图、录gif、MP4等等,自定义区域、全屏或者窗口,简直不要太方便。 Shottr 介绍地址: https://sspai.com/post/71485 https://www.appinn.com/shottr-for-macos/ cleanshot x Snipaste X…

js截取url问号前面_js截取url问号后参数并转化为对象

题目&#xff1a;js截取url问号后参数并转化为对象&#xff1b;function urlToObj(str){var obj {};var arr1 str.split("?");var arr2 arr1[1].split("&");for(var i0 ; i < arr2.length; i){var res arr2[i].split("");obj[res[0]…

HashMap的学习

文章目录HashMap特点原理示意图常用方法遍历元素LinkedHashMapHashMap 特点 1.世界上查询速度最快的数据结构 2.增删速度也很快 3.加载因子是集合存放的元素数量和散列数组长度的比值&#xff0c;建议加载因子 0.75&#xff0c;超过会自动扩容并且重新散列&#xff08;旧的数…

特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS

【0】README text description from orange’s implemention of a os . 【1】特权级概述 当当前代码段试图访问一个段或者门时&#xff0c;目标段的DPL将会和 CPL 以及段或门选择子的RPL相比较&#xff0c;如何比较&#xff1a;&#xff08;这里是干货&#xff09; &#xf…

java设计模式 订阅模式_Java中的复合设计模式

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

python 短网址_Python实现短网址ShortUrl的Hash运算实例讲解

本文实例讲述了Python实现短网址ShortUrl的Hash运算方法。分享给大家供大家参考。具体如下&#xff1a;shorturl实现常见的做法都是将原始Url存储到数据库&#xff0c;由数据库返回一个对应ID。以下要实现的是不用数据库支持就对原始URL进行shorturl hash。说到这里我们很容易想…

xml json 比较_JSON和XML:它们如何比较?

xml json 比较JSON和XML&#xff1a;它们如何比较&#xff1f; JSON和XML是两种人类可读的文本格式&#xff0c;多年来已成为竞争对手。 XML的目的是通过可选使用模式来存储和定义文档和数据。 JSON几乎完全相反-序列化格式的要求非常简单&#xff0c;可以放在信用卡背面。 但是…

HashSet的学习

文章目录HashSet特点常用方法增删改查性能分析LinkedHashSetHashSet 特点 1.不允许存储重复的元素 2.只允许存储一个 null 3.没有索引值&#xff0c;所以不能使用普通的 for 循环遍历集合元素&#xff0c;也没有与索引值相关的方法 4.是一个无序的集合&#xff0c;存储元素和…

为什么引入TSS

【0】README text description from orange’s implemention of a os and for complete code ,please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/p62.asm. 【1】 回忆——关于堆栈 通过调用门进行有特权级变换的转移——理论篇 &#xff08;1&#xff…