装饰器模式应用场景_装饰器设计模式的应用

装饰器模式应用场景

嗨,您好!

今天,我将展示装饰设计模式的实际应用。 装饰器设计模式是一种广泛使用的设计模式,同时在运行期间处理图形,树木和动态更改。

如果您正在寻找或尝试进行递归,这也是一个不错的选择。 我喜欢它。 在这篇文章中,我们将实现学生装饰。 我们将用学位和医生的头衔装饰它。 看看它如何在现实世界中工作的一个很好的例子。

首先,让我们看一下其最简单的版本的UML图。 之后,我们将以此类推为例。

最简单的UML

请密切注意,因为一旦您理解了,一切都会变得清晰易懂。 这就是我将最简单的模型放在第一位的原因。

装饰工

了解细节

装饰将是通用接口Decorable的每个具体实现。 装饰器将是抽象类Decorator的每个实现。 它定义了装饰者的合同,该合同持有可装饰对象的实例。 让我们深入研究一些代码来修复它:

// 1. COMMON INTERFACE FOR DECORABLES
public interface Decorable {public String getDescription();
}
// 2. THE ABSTRACT DECORADOR WHICH HOLDS A REFERENCE TO DECORABLES
public abstract class Decorator implements Decorable {protected Decorable component;public Decorator(Decorable component){super();this.component=component;}
}

类比我们的学生的例子

让我们首先从UML​​图开始:

装饰员(1)

普通可装饰女孩

在这里,我们从类比开始。 界面Girl是可装饰的。 GirlDecorator用下面的具体装饰器定义抽象装饰器的合同。

// 1. COMMON INTERFACE FOR DECORABLES
public interface Girl {public String getDescription();
}
// 2. THE ABSTRACT DECORADOR WHICH HOLDS A REFERENCE TO DECORABLES 
public abstract class GirlDecorator implements Girl {protected Girl girl;public GirlDecorator(Girl girl){super();this.girl=girl;}
}
// 3. DEFINING CONCRETE DECORATORS
public class Science extends GirlDecorator {public Science(Girl girl) {super(girl);}@Overridepublic String getDescription() {// DECORATES WITH A SCIENCE'S DEGREEreturn girl.getDescription() + "+Like Science";}public void caltulateStuff() {// ADDS NEW FEATURES (METHOD) TO ITSystem.out.println("scientific calculation!");}
}
public class Art extends GirlDecorator {public Art(Girl girl) {super(girl);}@Override public String getDescription() {return girl.getDescription() + "+Like Art";}public void draw() {System.out.println("draw pictures!");}
}
public class Doctor extends GirlDecorator {public Doctor(Girl girl) {super(girl);}@Override public String getDescription() {return girl.getDescription() + "+Like Doctor";}public void calculateStuff() {System.out.println("doctor calculation!");}public void doctorTitle() {System.out.println("doctor title");}
}

装饰物

AmericanGirl和EuropeanGirl是可在运行时以学位和医生名义装饰的装饰,以增强其课程和能力。

// 4. AN AMERICAN GIRL WILL BE DEFINED AS A DECORABLE
public class AmericanGirl implements Girl {private String description="";// NORMAL AMERICAN GIRLpublic AmericanGirl(){super();description = "+American";}@Override public String getDescription() {return description;}
}
public class EuropeanGirl implements Girl {private String description="";public EuropeanGirl() {super();description = "+European";}@Override public String getDescription() {return description;}
}

测试它

现在让我们在实践中看看它的外观。 我们如何在运行时装饰和增强其功能:

public class Client {public static void main(String[] args) {// COMMOM GIRLGirl girl;// CREATING NORMAL AMERICAN GIRLgirl = new AmericanGirl();System.out.println(girl.getDescription());// DECORANTING AMERICANA GIRL WITH SCIENCE'S DEGREEgirl = new Science(girl);System.out.println(girl.getDescription());// DECORANTING AMERICANA GIRL WITH ART'S DEGREEgirl = new Art(girl);System.out.println(girl.getDescription());// EUROPEAN GIRL HAS ALREADY ALL DEGREES   Girl europeia = new Science(new Art(new EuropeanGirl()));System.out.println(europeia.getDescription());// DOCTOR HAS NEW FUNCTIONS    girl = new Doctor(girl);System.out.println(girl.getDescription());// BECAUSE DOCTOR EXTENDS FROM COMMON GIRL, IT CAN DO A DOWNCAST((Doctor)girl).doctorTitle();((Doctor)girl).calculateStuff();// PAY ATTENTION THAT WE USE THE SAME INSTANCE, BUT THEY BEHAVIOR DIFFERENT// AT DIFFERENT TIME SLOTS. THE CLIENT HAS THE IMPRESSION THAT WE HAVE// CHANGED THE IMPLEMENTATION, BUT IN FACT NOT.}
}

就这样! 希望你喜欢!

翻译自: https://www.javacodegeeks.com/2014/08/decorator-design-pattern-applied.html

装饰器模式应用场景

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

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

相关文章

Auto Lisp 标注子样式_CSS 核心样式

CSS核心样式粗细font-weight作用:设置文字是否加粗显示属性名: font-weight, 属于font属性的一个单-属性属性值有两种方式:单词类型、数字类型单词类型数字类型100-900之间的整百数字数字越大,文字显示越粗其中400等价于normal, 700等价于bold字体风格font-style作用…

Spring @Order批注

介绍: Spring Order注释是在Spring 2.0中首次引入的。 然后,它仅用于定义AspectJ建议中的顺序。 在Spring 4.0的后面,对该注释的实现进行了进一步改进。 从那时起,它还支持对Java数组或List之类的集合中的Spring组件或bean进行排序…

stm32 内部sram大小_让STM32的外部SRAM操作跟内部SRAM一样

让STM32的外部SRAM操作跟内部SRAM一样前几天看到开源电子论坛(openedv)有人在问这个问题,我特意去做了这个实验,这样用外部SRAM就跟用内部SRAM一样,不用自己去申请内存,也不用考虑什么内存地址,一切让编译器自己去解决…

react动态改变选中不选中_当使用react hooks选中任何复选框时,如何使启用按钮起作用?...

当选中任何复选框时,我在启用按钮时有一个错误。目前它在第一次点击时不起作用,而只在第二次点击时起作用。取消选中复选框也适用于第一次单击。我认为这与各州有关,但我不太明白是什么导致了这个问题。checked.length > 0 ? setTaskBtnsEnabled(true) : setTaskBtnsEnable…

javafx_JavaFX技巧4:总结

javafx在为JavaFX开发自定义控件时,我强烈建议您遵循JavaFX核心控件的脚步,并尽可能使控件的API最终化,并将“ final”关键字放在所有方法声明的前面。 例 在FlexGanttFX中,我有很多看起来像这样的代码: public fina…

均质机工作原理动画_3D动画演示:有刷直流电机的工作原理

点上面蓝色字体直观学机械可长期订阅我们法律顾问:赵建英律师下面这张图是电机的分类,在看完这张图后,大家基本也就知道咱们今天说的有刷电机具体属于哪一类了。下面这个是LearnEngineering制作的动画,讲解的是直流电机的工作原理…

通过SSL发送的Java邮件

抽象 本博客的目的是演示如何使用Java Mail通过具有SSL连接的SMTP服务器发送电子邮件。 免责声明 这篇文章仅供参考。 在使用所提供的任何信息之前,请认真思考。 从中学到东西,但最终自己做出决定,风险自负。 要求 我使用以下主要技术完成了…

a113 智能音箱芯片方案_高通入局智能音箱,首款四核单芯片方案曝光

不得不说,智能音箱已经成为目前重要的科技品类之一,许多公司包括亚马逊、谷歌、苹果、阿里巴巴、小米等等,都在大举进军智能音箱市场。为了尽可能为更多产品提供核心原件,近日,高通公司推出了一款全新的SOC系列——QCS…

OCA第6部分中的Java难题

即使对于新的Java开发人员,构造函数也可能不是什么大谜。 本质上,当您创建一个类的实例时,该类的构造函数就会启动。 在Java Puzzlers系列的第6部分中,我们将看到一个与构造函数有关的案例。 public class Puzzler { public Puzzl…

隐藏水滴屏的软件_屏下摄像头,实现这一全面屏终极方案有多难?

为了实现真正全面屏,手机厂商们到底能有多拼?在奔向全面屏的征途里,导航键、听筒、传感器、指纹识别模组等都被成功解决,隐藏在边框或屏幕底。唯独前置摄像头,成为全面屏征途的最后一块终极障碍。这场由iPhone X刘海屏…

java ee api_Java EE并发API教程

java ee api这是一个示例章节,摘自Francesco Marchioni编辑的WildFly上的实用Java EE 7开发 。 本章讨论了新的Java EE并发API(JSR 236) ,它概述了使用一组托管资源在Java EE容器上并行执行任务的标准方法。 为了描述如何在您的应…

二进制_简学:二进制数制的应用

设现有正整数150,二进制形式为10010110,现有如下题目,求其尽可能简单的解法。题目一:判断该正整数是否是2的乘方;解法:由上表可以看出2的乘方的二进制形式只有一个bit为1,因此判断一个正整数A是…

令人惊讶的注射

所以,我欠吉姆道歉。 他编写了一个有效的模拟和JUnit测试,我在回顾中告诉他,我认为它没有达到他的预期。 当我错了时,这种情况对我来说就像是一个错误 。 称其为理想的意外副作用。 假设您有以下两类: public class S…

swagger 动态设置版本号_如何快速玩转swagger

Spring Boot 框架是目前非常流行的微服务框架,我们很多情况下使用它来提供 Rest API。而对于 Rest API 来说很重要的一部分内容就是文档,Swagger 为我们提供了一套通过代码和注解自动生成文档的方法,这一点对于保证 API 文档的及时性将有很大…

angular java_带有Angular JS的Java EE 7 –第1部分

angular java今天的帖子将向您展示如何使用Java EE 7和Angular JS构建一个非常简单的应用程序。 在去那里之前,让我告诉您一个简短的故事: 我必须承认,我从来都不是Java语言的忠实拥护者,但是我仍然记得我第一次使用它。 我不记得…

操作系统的msxml组件版本过低_Zabbix 5.0 LTS 版本安装

zabbix 5.0 版本于 5 月 11 日正式发布,是最新的 LTS(长期支持)版本,5.0 带来很多功能和特性,后面会陆续推出文章介绍,下面主要介绍下 5.0 版本的安装。环境要求5.0 版本对基础环境的要求有大的变化,最大的就是对 php …

登录判断_Spring Security之多次登录失败后账户锁定功能的实现

在上一次写的文章中,为大家说到了如何动态的从数据库加载用户、角色、权限信息,从而实现登录验证及授权。在实际的开发过程中,我们通常会有这样的一个需求:当用户多次登录失败的时候,我们应该将账户锁定,等…

通过TLS发送的Java邮件

抽象 本博客的目的是演示如何使用Java Mail通过具有TLS连接的SMTP服务器发送电子邮件。 免责声明 这篇文章仅供参考。 在使用所提供的任何信息之前,请认真思考。 从中学到东西,但最终自己做出决定,风险自负。 要求 我使用以下主要技术完成了…

html实体转化字符串 php_php将字符串转为HTML的实体引用的一个类

class HtmlEncode {static $_convertToHtmlEntitiesSrcEncodingUTF-8;/*** 将非ASCII字符串转换成HTML实体** example HtmlEncode::encode("我信了"); //输出:我信了* param string $s 要进行编码的字符串* return string 返回HTML实体引用*/public static function …

arcgis导入excel字段不显示_ArcGIS从excel中导入坐标出现空白无法选择字段

怎样将PDF转成EXCEL怎样将PDF转成EXCEL EXCEL和PDF这两种文档大家应该都比较熟悉,EXCEL表格是使用于数据图表得整理,而PDF文件是用于扫描或者存档,但是这两者之间经常需要进行转换得,比如说经常需要将归档的PDF文件转换成EXCEL表格…