设计模式的Java 8 Lambda表达式–装饰器设计模式

Decorator模式(也称为Wrapper )允许将行为静态或动态地添加到单个对象,而不会影响同一类中其他对象的行为。 可以将其视为子类的替代方法。 我们知道子类在编译时会增加行为,并且更改会影响原始类的所有实例。 另一方面,装饰可以在运行时为选择性对象提供新的行为。

装饰器与其装饰的组件的接口一致,从而对组件的客户端透明。 装饰器将请求转发到组件,并且可以在转发之前或之后执行其他操作。 透明度允许装饰器递归嵌套,从而允许无限数量的添加职责。 装饰器模式的主要参与者如下所示:

装饰工

  • 组件 –指定可以动态添加职责的对象的接口。
  • ConcreteComponent –定义可以添加其他职责的对象
  • 装饰器 –保留对Component对象的引用并符合Component的接口。 它包含要装饰的Component对象。
  • ConcreteDecorator –向组件添加责任。

现在,让我们来看一个装饰器模式的具体示例,并看一下如何使用lambda表达式对其进行转换。 假设我们有不同类型的书籍,而这些书籍的封面或类别可能不同。 我们可以选择任何书籍,并通过继承来指定类别或语言。 可以将书籍抽象为一类。 之后,任何其他类都可以扩展Book类并覆盖cover或category的方法。 但这不是一种有效的方法。 在这种方法下,子类可能具有从超类扩展过来的不必要的方法。 同样,如果我们必须添加更多的属性或特性,则父类也会有所变化。 更改类的实现应该是最后的选择。

让我们通过使用装饰器模式来采取最佳方法。 我们将使用基本方法为Book创建一个接口:

public interface Book {public String describe();}

BasicBook类可以实现此接口以提供最小的抽象:

public class BasicBook implements Book {@Overridepublic String describe() {return "Book";}}

接下来,让我们定义抽象类BookDecorator ,它将充当Decorator:

abstract class BookDecorator implements Book {protected Book book;BookDecorator(Book book) {this.book = book;}@Overridepublic String describe() {return book.describe();}
}

BookDecorator类符合Book接口,并且还存储对Book接口的引用。 如果要将类别作为属性添加到Book接口,则可以使用实现BookDecorator接口的具体类。 对于小说类别,我们可以使用以下装饰器:

public class FictionBookDecorator extends BookDecorator {FictionBookDecorator(Book book) {super(book);}@Overridepublic String describe() {return ("Fiction " + super.describe());}
}

您可以看到FictionBookDecorator在原始操作(即描述)中添加了图书的类别。 同样,如果要指定“科学”类别,则可以具有相应的“ ScienceBookDecorator”

public class ScienceBookDecorator extends BookDecorator {ScienceBookDecorator(Book book) {super(book);}@Overridepublic String describe() {return ("Science " + super.describe());}
}

ScienceBookDecorator还会在原始操作中添加书籍的类别。 也可以有另一套装饰器,指示书籍的封面类型。 我们可以用SoftCoverDecorator来描述这本书有一个软封面。

public class SoftCoverDecorator extends BookDecorator {SoftCoverDecorator(Book book) {super(book);}@Overridepublic String describe() {	return (super.describe() + " with Soft Cover");}
}

我们还可以使用HardCoverDecorator来描述这本书的精装本。

public class HardCoverDecorator extends BookDecorator {HardCoverDecorator(Book book) {super(book);}@Overridepublic String describe() {	return (super.describe() + " with Hard Cover");}
}

现在,让我们结合定义的所有类和接口,以利用Decorator模式的强大功能。 仅查看所有这些类的一个示例相互作用:

import java.util.List;
import java.util.ArrayList;public class BookDescriptionMain {public static void main(String [] args) {BasicBook book = new BasicBook();//Specify book as Fiction categoryFictionBookDecorator fictionBook = new FictionBookDecorator(book);//Specify that the book has a hard coverHardCoverDecorator hardCoverBook = new HardCoverDecorator(book);//What if we want to specify both the category and cover type togetherHardCoverDecorator hardCoverFictionBook = new HardCoverDecorator(fictionBook);				//Specify book as Science categoryScienceBookDecorator scienceBook = new ScienceBookDecorator(book);//What if we want to specify both the category and cover type togetherHardCoverDecorator hardCoverScienceBook = new HardCoverDecorator(scienceBook);				//Add all the decorated book items in a listList<Book> bookList = new ArrayList<Book>() {{add(book);add(fictionBook);add(hardCoverBook);add(hardCoverFictionBook);add(scienceBook);add(hardCoverScienceBook);}};//Traverse the list to access all the book itemsfor(Book b: bookList) {System.out.println(b.describe());}		}
}

运行此命令可获得以下输出:

Book
Fiction Book
Book with Hard Cover
Fiction Book with Hard Cover
Science Book
Science Book with Hard Cover

它清楚地说明了如何将不同的属性添加到任何预定义的类/对象。 同样,可以组合多个属性。 我试图将所有装饰的书本组合在一个列表中,然后通过遍历该列表来访问它们。

到目前为止,我们所看到的只是标准的装饰器模式,而且已经存在了很长时间。 在这些时候,当函数式编程成为新的流行语时,人们可能会思考Java中对lambda表达式的支持是否会有所不同。 实际上,由于修饰后的接口就像一个函数接口,因此我们可以使用Java中的lambda表达式进行哈希处理。 让我们看一下代码的样子:

import java.util.List;
import java.util.ArrayList;public class BookDescriptionMainWithLambda {public static void main(String [] args) {BasicBook book = new BasicBook();//Specify book as Fiction category using Lambda expressionBook fictionBook = () -> "Fiction " + book.describe();//Specify that the book has a hard cover using Lambda expressionBook hardCoverBook = () -> book.describe() + " with Hard Cover";//What if we want to specify both the category and cover type togetherBook hardCoverFictionBook = () -> fictionBook.describe() + " with Hard Cover";				//Specify book as Science category using Lambda expressionBook scienceBook = () -> "Science " + book.describe();//What if we want to specify both the category and cover type togetherBook hardCoverScienceBook = () -> fictionBook.describe() + " with Hard Cover";				List<Book> bookList = new ArrayList<Book>() {{add(book);add(fictionBook);add(hardCoverBook);add(hardCoverFictionBook);add(scienceBook);add(hardCoverScienceBook);}};bookList.forEach(b -> System.out.println(b.describe()));}
}

运行此命令可获得类似的输出:

Book
Fiction Book
Book with Hard Cover
Fiction Book with Hard Cover
Science Book
Fiction Book with Hard Cover

我们可以看到,使用lambda表达式会使装饰器的其他类变得多余。 您不需要其他课程; 只需使用lambda表达式指定其他行为。 但是,支持再次找到装饰器以供重新使用。 如果您有具体的装饰器类,则下次也可以重用它。

  • 可以从我的github存储库访问所有代码片段

翻译自: https://www.javacodegeeks.com/2015/12/java-8-lambda-expression-design-patterns-decorator-design-pattern.html

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

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

相关文章

ie浏览器网页版进入_IE浏览器打开网页提示无法打开Internet站点的解决办法

IE浏览器打开网页时提示Internet explorer无法打开站点&#xff0c;这是什么问题&#xff1f;Internet explorer打不开网页提示无法打开站点怎么办&#xff1f;请看下文五种解决办法。方法一&#xff1a;管理加载项打开浏览器—工具—Internet选项这时会出现“Internet选项”对…

epic转移游戏_Epic游戏商城更改退款政策 和steam一模一样

游侠网关注我们&#xff0c;获得最快的游戏资讯Epic正在打造自己的数字游戏商城&#xff0c;一方面对开发者提供更慷慨的销售分成&#xff0c;另一方面对玩家提供每两个月更新一次的免费游戏。虽然Epic游戏商城中的作品数量还在起步阶段&#xff0c;也缺少一些关键的常用功能&a…

计算机组成原理实验三报告,计算机组成原理实验三报告

计算机组成原理实验三报告 实 验 报 告 三课 程 计算机组成原理 姓 名 学 号实验项目 存储器实验 同组姓名 学 号指导教师 专业班级 计算机科学与技术 09 实验时间 2011-6-6实验三 存储器实验一、实验目的1&#xff0e;掌握存储器的功能和构成。2&#xff0e;了解静态随机存储器…

防盗Java EE –保护您的Java EE企业应用程序

redev离我们仅有几天的路程&#xff0c;我受邀作了两次演讲。 其中之一是关于我最喜欢的主题&#xff1a;安全性和Java EE。 它旨在实现两个目标。 一方面向典型的Java EE开发人员介绍整个应用程序安全过程和主要目标。 而且还要查看有关Java EE在满足典型需求时必须提供的内容…

wsl nvidia驱动_WIN10安装NVIDIA面板两种方式

无应用商店安装NVIDIA面板进入NVIDIA官网下载标准版驱动https://www.nvidia.cn/Download/Find.aspx?langcn​www.nvidia.cn驱动类型选择标准下载的名称选择NVIDIA Studoio Driver SD这样下载出来的驱动就带有NVIDIA面板控制面有应用商店但是下载不动的可以使用下面的方式打开网…

Python之内置函数

Python内置函数 #1、语法 # eval(str,[,globasl[,locals]]) # exec(str,[,globasl[,locals]])#2、区别 #示例一&#xff1a; s123 print(eval(s)) #eval用来执行表达式&#xff0c;并返回表达式执行的结果 print(exec(s)) #exec用来执行语句&#xff0c;不会返回任何值6 None …

latex 无穷_《天龙3D》新资料片“骑乐无穷”即将上线

驭风逐战&#xff0c;骑乐无穷。11月12日金庸正版授权、全民第一武侠RPG手游《天龙3D》新资料片“骑乐无穷”即将上线!全新坐骑装备系统开启&#xff0c;升星养成坐骑装备;全新坐骑相关副本四绝夺魁&#xff0c;多人闯关PVP、PVE组队竞技;元旦主题月即将开启&#xff0c;趣味游…

广州大学计算机学院毕业设计,【广州大学】毕业设计(计算机科学与技术)专业要求...

广州大学成人高等教育毕业设计专业要求【专业名称】计算机科学与技术【适用范围】非学位论文【执笔者】谷岩【完成形式】个人独立【写作形式】毕业设计【写作要求】1&#xff0e;目标毕业设计是计算机科学与技术专业人才培养的重要环节。其主要目标是培养学生综合应用计算机科学…

实验二+140+阮晨曦

---恢复内容开始--- 一、实验目的 掌握覆盖测试的基本方法和实践 二、实验要求 运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例&#xff0c;并运行测试用例检查程序的正确与否&#xff0c;给出程序缺陷小结。 三、实验内容 &#xff08;1&#xff09;设计某程序的路径覆盖测…

hadoop重命名文件_Hadoop -- 3. 从Flume到HDFS

提起Flume, 就先讲一下它的基本作用, 它可以从不同的数据源导入到一个集中的地方存放起来,基本架构如下图所示*上图为Flume Data Flow Model, Ref: Flume 1.9.0 User Guide本篇文章会做一个小demo, 数据从spooling directory来(而不是官网图中画的Web Server), 先经过channel, …

电脑计算器_CPA考生注意!2020考场只允许带这种计算器

注册会计师每年采用闭卷、计算机化考试方式。根据往年考生的反应&#xff0c;计算器的使用在考场上发挥了非常大的作用。值得大家注意的是&#xff0c;并不是所有的计算器都能带进考场&#xff0c;考试对计算器有什么要求?如何挑选到正确的计算器&#xff1f;我们一起来看看&a…

最早的齿轮计算机,世界最古老“计算机”出土后110年,科学家终于解开它的秘密...

伦敦大学学院(UCL)的研究团队&#xff0c;提出了“一个激进的新模型&#xff0c;与所有数据相匹配&#xff0c;并最终优雅地展示出了古希腊人眼中的宇宙”。1901年&#xff0c;在希腊岛屿安提基特拉的海岸&#xff0c;潜水员偶然发现了一艘古代沉船。沉船中的一件文物&#xff…

通过Java 8中的Applicative Builder组合多个异步结果

几个月前&#xff0c;我发布了一个出版物 &#xff0c;在其中详细解释了我提出的名为Outcome的抽象&#xff0c;它通过强制使用语义帮助了我很多 没有副作用的代码。 通过遵循这种简单&#xff08;但功能强大&#xff09;的约定&#xff0c;我最终将任何类型的故障&#xff08;…

diskgenius 接触“只读“失败_相亲总是失败,这三个步骤你都做了吗?

原标题&#xff1a;相亲总是失败&#xff0c;这三个步骤你都做了吗&#xff1f;虽然现在爱情很稀缺&#xff0c;但想必大家都想找个男女朋友&#xff0c;想谈一场甜甜的恋爱。 而相亲&#xff0c;无疑是脱单最直接、最有效的方式&#xff0c;没有之一。但不管是经人介绍&#x…

agv系统介绍_重载AGV小车主要结构及导航原理是什么?

相信对AGV有过了解的朋友都知道&#xff0c;当我们在进行工业生产过程时&#xff0c;重载AGV小车可以帮我们实现无人驾驶搬运的一个工作&#xff0c;可以保证AGV在运行时不用通过人工干预的情况下来完成现场的搬运工作,通过无人驾驶技术进行自主导航将货物自动从起始位置搬运到…

怎样打开计算机音频服务器,win10系统音频服务器未运行的修复步骤

有关win10系统音频服务器未运行的操作方法想必大家有所耳闻。但是能够对win10系统音频服务器未运行进行实际操作的人却不多。其实解决win10系统音频服务器未运行的问题也不是难事&#xff0c;小编这里提示两点&#xff1a;1、在1、windows10“音频服务未运行”,有个红色小叉咋办…

rgb fusion检测不到显卡_【论文阅读27】Co-Fusion

主要内容物体级别的语义SLAM。维护一个背景模型和多物体模型&#xff0c;每个模型由面元地图表示。基于运动分割和语义信息检测运动物体。使用基于ICP对齐的几何误差和基于颜色差异的光度误差跟踪背景模型&#xff08;相机位姿&#xff09;和多个运动物体。根据[8]的方法更新每…

u盘插在电脑上灯亮没有反应_u盘插入电脑无反应怎么解决 u盘插入电脑无反应解决方法【步骤介绍】...

u盘的轻巧、便捷使其在生活工作中重要的工具设备&#xff0c;在使用u盘的过程中插入的 u盘无法识别 &#xff0c;电脑对插入的u盘无反应&#xff0c;遇到这样的问题该怎么办呢?接下来小编就和大家介绍 电脑无法识别u盘 的解决办法。1 、使用其它的移动设备插在电脑usb接口上&a…

recaptcha_与reCAPTCHA的Spring集成

recaptcha有时我们只需要CAPTCHA &#xff0c;这是一个可悲的事实。 今天&#xff0c;我们将学习如何与reCAPTCHA集成。 因为主题本身并不是特别有趣和高级&#xff0c;所以我们将通过使用Spring Integration处理低级细节来过度设计&#xff08;&#xff1f;&#xff09;。 Goo…

honeywell新风系统控制面板说明_如何选择新风系统中的新风设备万家舒适家

喜欢点击蓝字关注我们吧我们常说“看人不光要看外表&#xff0c;更要看内在”&#xff0c;这个说法对新风机同样适用。新风机的内部件主要分为&#xff1a;动力模块、电控模块、净化模块、热交换模块这四个部分。首先、动力模块&#xff0c;就是风机。从我们消费者角度来看&…