用装饰器设计模式装饰

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

问题陈述:

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

意图:

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

解:

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

结构体

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,一经查实,立即删除!

相关文章

linux 内存强度测试软件,linux下的CPU、内存、IO、网络的压力测试工具与方法介绍...

使用工具stressCentos# yum -y install stressUbantu# apt-get install stress# stress --helpstress imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-?, --help show this help statement--version show version statement-v, --v…

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、选择自定义安装,这样方便我们更好了解虚拟机,然后点击下一步。.…

REST与Apache Camel

在Camel中公开HTTP终结点的方法有很多:jetty,tomcat,servlet,cxfrs和restlet。 其中的两个组件– cxfrs和restlet也只需几行代码即可支持REST语义。 这个简单的示例演示了如何使用camel-restlet和camel-jdbc进行CRUD操作。 四个HT…

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

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

input点击链接另一个页面,各种操作。

1.链接到某页<input type"button" name"Submit" value"确 定" class"btn" οnclick"location.hreffilename.html" />2.返回(等同后退)<input name"Submit2" type"button" class"btn"…

80. Remove Duplicates from Sorted Array II

题目描述 Follow up for “Remove Duplicates”: What if duplicates are allowed at most twice? For example, Given sorted array nums [1,1,1,2,2,3], Your function should return length 5, with the first five elements of nums being 1, 1, 2, 2 and 3. It doesn…

JavaFX 2 XYCharts和Java 7功能

我最喜欢的JavaFX 2功能之一是它在javafx.scene.chart包中提供的标准图表。 该软件包提供了几种不同类型的现成图表。 除了其中之一&#xff08; PieChart &#xff09;以外&#xff0c;所有其他都是“ 2轴图”&#xff08; XYChart的特定实现&#xff09;。 在本文中&#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…

merge

merge语句具有按条件获取要更新或插入到表中的数据行&#xff0c;然后从1个或多个源头对表进行更新或向表中插入行两方面的能力。经常用在数据仓库中移动大量数据。 语法: merge<hint> into<table_name> using<table_view_or_query> on<condition> whe…

可以优化同步吗?

总览 有一个常见的误解&#xff0c;因为JIT很智能&#xff0c;并且可以消除对象的同步&#xff0c;而该对象仅存在于不影响性能的方法中。 比较StringBuffer和StringBuilder的测试 这两个类基本上做相同的事情&#xff0c;除了一个是同步的&#xff08;StringBuffer&#xff0…

perl exe执行提示缺少文件解决方法

在项目开发中&#xff0c;使用perl语言编译的exe可执行文件;在项目中使用了XML::LibXML模块&#xff1b;发现exe在本机电脑执行正常&#xff0c;但在其他同事执行时却提示缺少libxml2-2.dll等文件。 问题现象&#xff1a; 无法启动此程序&#xff0c;因为计算机中丢失libxml2-2…

华为抢购助手_华为荣耀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 属性将失效…