设计模式的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,一经查实,立即删除!

相关文章

计算机管理home,电脑home键是什么意思

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。以win7为例&#xff0c;电脑键盘上的Home键是微软Windows操作系统中具有返回功能的按键&#xff0c;根据Windows不同的操作环境&#xff0c;home键的功能也会有区别。电脑(computer&…

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

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

go token验证_registry v2 解析以及如何实现token验证

提到registry v2&#xff0c;主要改进是支持并行pull镜像&#xff0c;镜像层id变成唯一的&#xff0c;解决同一个tag可能对应多个镜像的问题等等。如果还不太了解&#xff0c;可以且听我细细道来。首先不得不说的是v2 新加了一个概念Digest他是基于内容进行寻址(Content-addres…

创建一个简单的 MDM server(1)

前提&#xff1a;已获得 APNS 证书 &#xff0c;已完毕 MDM 配置描写叙述文件的制作。请參考《 MDM 证书申请流程 》一文和《配置MDM Provisioning Profile》。环境&#xff1a;OSX 10.9.2&#xff0c;JDK 1.6。Eclipse JavaEE Helois&#xff0c;Tomcat 7.0一、前言《THE IOS …

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在满足典型需求时必须提供的内容…

Digui

public class Digui{ public static void main(String args[]){ System.out.println("计算结果&#xff1a;" sum(100)) ; //调用操作 } public static int sum(int num){ //定义方法用于求和操作 if(num 2){ //判断是否是加到了最后一个数 return 2 ; }else{ retur…

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

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

计算机组成原理mbps,2016年湖北师范学院计算机组成原理(同等学力加试)复试笔试仿真模拟题...

一、选择题1&#xff0e; 若x103&#xff0c;y-25, 则下列表达式采用8位定点补码运算实现时&#xff0c;会发生溢出的是( )A.xyB.-xyC.x-yD.-x-y【答案】c2&#xff0e; 假定一台计算机的显示存储器用DRAM 芯片实现&#xff0c;若要求显示分辨率为1600x1200&#xff0c;颜色深度…

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 …

android 头像球_Android一行代码实现圆形头像

效果图在开发APP中&#xff0c;经常要实现圆形头像&#xff0c;那么该如何实现呢&#xff1f;要裁剪吗&#xff0c;要重写draw函数吗&#xff1f;不用&#xff0c;只用一行代码就可以实现Glide实现圆形图像Glide.with(mContext).load(R.drawable.iv_image_header).error(R.draw…

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, …

osgi 模块化_OSGI –模块化您的应用程序

osgi 模块化由于我是模块化&#xff0c;低耦合&#xff0c;高凝聚力等的大力拥护者&#xff0c;所以…… 我相信这项技术是我们使用Java平台创建应用程序的突破。 使用OSGi&#xff0c;创建高度可扩展的应用程序非常简单&#xff0c;例如参见Eclipse IDE。 我的目的不是要深入展…

电脑计算器_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;…