用装饰器设计模式装饰

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

问题陈述:

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

意图:

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

解:

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

结构体

Decorator Design Pattern

装饰器设计模式结构

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

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

例:

Decorator Design Pattern Example

装饰器设计模式示例

在上面的示例中,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

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

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

相关文章

vcpkg安装_微软牌包管理器vcpkg更新及路线图计划

蝎子vcpkg是一套跨平台,开源的C/C库管理器,今天的这篇文章是有关vcpkg主题的2020年4月博文更新。在这篇文章中,我们将分享有关vcpkg 2020.04发布版本的一些信息以及vcpkg的路线图(roadmap),我们会在这里持续地发布有关vcpkg的最新…

CSS 盒模型与box-sizing

一、盒模型 一个web页面由许多html元素组成,而每一个html元素都可以表示为一个矩形的盒子,CSS盒模型正是描述这些矩形盒子的存在。 MDN的描述: When laying out a document, the browsers rendering engine represents each element as a r…

Java课程设计 购物车系统(个人博客) 201521123052 蓝锦明

1. 团队课程设计博客链接 课程设计团队博客 2. 个人负责模块或任务说明 (1)制作图形菜单引导界面 (2)定义各获取和输出类函数 3. 自己的代码提交记录截图 4. 自己负责模块或任务详细说明 import java.text.NumberFormat; public c…

7-12(图) 社交网络图中结点的“重要性”计算(30 分)

在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来。他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用,可以增强也可以减弱。而结点根据其所处…

linux系统的安装程序,Linux系统安装

为了不影响本机系统,建议在虚拟机上创建并安装Linux系统,本次安装centos7 64位的镜像。详细步骤如下:1、首先在虚拟机主页创建新的虚拟机。... 图1.1 2、选择自定义安装,这样方便我们更好了解虚拟机,然后点击下一步。.…

百米路由器2登陆地址_腾达无线路由器怎么安装,真的不错

腾达无线路由器怎么安装1、WAN口连接宽带进线(即网络公司进来的线或猫出来的线,一般颜色不一样)、LAN口连接局域网内的电脑。2、设置所连接电脑的IP地址。右键点击网上邻居属性3、右键点击本地连接属性4、选择Internet协议TCP/IP属性5、点击选择自动获得IP地址和自动…

JavaFX 2 XYCharts和Java 7功能

我最喜欢的JavaFX 2功能之一是它在javafx.scene.chart包中提供的标准图表。 该软件包提供了几种不同类型的现成图表。 除了其中之一( PieChart )以外,所有其他都是“ 2轴图”( XYChart的特定实现)。 在本文中&#xff…

前端基础-HTML的的标签详解

阅读目录 一、head内常用标签二、 HTML语义化三、 字符实体四、 h系列标签五、 p标签六、 img标签七、 a标签八、 列表标签九、 table标签十、 form标签 一、 head内常用标签 1、meta相关 #1、指定字符集<meta charset"gbk">#2、页面描述<meta name"…

new失败跟踪函数_WinDbg预览时间线:调试器中的时间线可以允许用户记录跟踪

时间旅行调试(TTD)允许用户记录跟踪&#xff0c;这些跟踪是对程序执行的记录。时间线是执行过程中发生的事件的直观表示&#xff0c;这些事件可以是包括断点&#xff0c;内存读/写&#xff0c;函数调用和返回以及异常。使用时间线窗口可以快速查看重要事件&#xff0c;了解相对…

linux 进程的执行时间,Linux 获取进程执行时间

Linux 获取进程执行时间1 前言测试一个程序的执行时间, 时间包括用户 CPU 时间系统 CPU 时间时钟时间之前获取之前时间都是在程序的 main 函数用 time 函数实现, 这个只能粗略的计算程序的执行时间, 不能准确的获取其他时间在看 APUE 时, 书中有关程序时间测试程序, 非常正规, …

Java环境变量的设置

1.计算机->属性->高级系统设置->环境变量 2.设置JAVA_HOME和path&#xff0c;1.5之后的JDK可以不设置classpath 3.JAVA_HOME的路径是JDK的安装路径 4.在系统变量里面找到path&#xff0c;然后点击修改&#xff0c;在最后面添加%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 5…

华为抢购助手_华为荣耀20系列手机采用的五项新科技,科普简介

5月底荣耀20系列在上海发布&#xff0c;荣耀20系列旗舰手机拥有五项荣耀自主研发的新科技&#xff0c;包括LinkTurbo网络聚合加速、超级NFC、方舟编译器、人性化YOYO智慧生命体&#xff0c;超级蓝牙。下面分别介绍一下这五项新科技。LinkTurbo网络聚合加速先来科普一下LinkTurb…

Flex弹性布局

1 Flex: 弹性布局 (转) 任何一个容器都可以指定为 Flex 布局。 1 .box {2  display: flex;3 } 行内元素也可以使用 Flex 布局。 1 .box{2 display: inline-flex;3 } 注意&#xff0c;设为 Flex 布局以后&#xff0c;子元素的 float、 clear 和 vertical-align 属性将失效…

firewallD卸载Linux,在Ubuntu 18.04/16.04系统上安装和使用Firewalld的方法

本文介绍Firewalld在Ubuntu 18.04或Ubuntu 16.04发行版上的安装方法及基本用法。简介Firewalld是Linux防火墙管理工具&#xff0c;支持IPv4、IPv6、以太网桥和IPSet防火墙设置&#xff0c;它充当Linux内核的netfilter框架的前端&#xff0c;同时Firewalld是RHEL 7系列上的默认防…

PCGen的垃圾收集分析

介绍 我决定结合我的两个软件爱好&#xff0c;并在PCGen上进行一些分析&#xff0c; PCGen是一种流行的基于Java的开放源代码角色生成器&#xff0c;用于角色扮演游戏。 我用Censum &#xff0c;我们&#xff08; jClarity的&#xff09;新的垃圾收集日志分析工具来进行分析。 …

springboot不会运行gc_SpringBoot 和JVM 调优(深度好文,建议收藏)

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]项目调优作为一名工程师&#xff0c;项目调优这事&#xff0c;是必须得熟练掌握的事情。在SpringBoot项目中&#xff0c;调优主要通过配置文件和配置JVM的参数的方式进行。一、修改配置文件关于修改配置文件 application.p…

3dobject用什么打开_第一次用开塞露是什么感觉?网友:像打开了新世界的大门

第一次用开塞露是什么感觉&#xff1f;网友:像打开了新世界的大门我妈说我小时候便秘去医院&#xff0c;医生给开了支开塞露&#xff0c;然后在医院的公厕里使用的&#xff0c;我妈的描述是:“要不是我手挪走的快点&#xff0c;就直接喷我手了”。。。。。。。。。。。。。。。…

Java 7中对String.substring的更改

众所周知&#xff0c;在您生成相同源字符串的许多子字符串的情况下&#xff0c;Java会优化子字符串操作。 它通过使用(value, offset, count)存储信息的方式来做到这一点。 请参阅以下示例&#xff1a; 在上图中&#xff0c;您会看到字符串“ Hello”和“ World&#xff01;”…

原生js创建模态框

1.效果图如下&#xff1a; 2.代码如下&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"><title>Test</title><style>#pageMask {visibility: hidden; position: absolute;left: 0px; top: 0px;width:…

CSS节选——选择器

CSS&#xff0c;cascading style sheet&#xff0c;层叠样式表&#xff0c;请留意层叠概念。 css3为了区分伪类和伪元素&#xff0c;伪元素采用双冒号写法。 常见伪类——:hover,:link,:active,:target,:not(),:focus。 常见伪元素——::first-letter,::first-line,::before…