改变数据类型的装饰器_用装饰器改变收藏

改变数据类型的装饰器

装饰图案

自从第一次学习编程设计模式以来,装饰器模式一直是我的最爱。 在我看来,这是一个很新颖的想法,比其他想法有趣得多。 不要误会我的意思,其他大多数人也引起了我的注意,但没有什么比装饰器模式更重要。 至今,它仍然是我的最爱之一。

(如果您不熟悉设计模式,我强烈建议您采用Head First Design Patterns 。如果您只是想学习装饰器模式,请参考这本书的装饰器章节摘录 。)

我个人认为装饰器模式通常未得到充分利用。 可能有几个原因。 一方面,我认为这不适用于所有情况。 另外,装饰器模式可以解决的问题通常很难发现。 是什么让该模式如此令我赞叹,这是因为可能很难弄清楚需要在何处,这是因为它是一个不寻常的想法。 就是说,直到您对“继承之上的构成”的原理非常熟悉为止。

太多的地方将继承深深地打入您的脑海,以至于使人难以相信组合通常是比继承更好的主意。

无论如何,装饰器模式不仅是我最喜欢的模式,而且在Java 8我最喜欢的新功能之一中也强烈使用了它:Stream API。 实际上,我要向您展示的大部分内容都在很大程度上模仿了Stream API的某些行为。

问题

假设您有一个字符串列表,但它们可能有也可能没有不需要的前导或尾随空格。 您可能会这样做,以消除不需要的空间。

List untrimmedStrings = aListOfStrings();
List trimmedStrings = new ArrayList();for(String untrimmedString : untrimmedStrings)
{trimmedStrings.add(untrimmedString.trim());
}//use trimmed strings...

在这种情况下,您将创建一个全新的字符串列表,并使用第一个列表中的字符串填充该字符串,但会对其进行修剪。 这有几个问题。 首先,它立即创建了一个完整的新列表。 相反,每个修剪后的String的创建都可以延迟到需要时才进行,甚至在不需要时也永远不会执行。 另外,如果有人想添加更多字符串,则必须将它们添加到两个列表中。 您还必须确保先修剪新的字符串,然后再将它们放入修剪的列表中。 最后,此代码是命令性的,而不是声明性的。

让我们看一下代码的更具声明性的版本,然后看看如何使用它来解决其他问题。

List untrimmedStrings = aListOfStrings();
List trimmedStrings = trimmed(untrimmedStrings);//use trimmed strings...

哎呀,该trimmed()函数可能会发生任何事情! 看看那个; 它返回字符串列表,就像前面的方法一样。 这样做的好处,对吧?

错误。 是的,该函数从技术上讲可以做与之前相同的操作,这意味着我们所做的只是使外部代码具有声明性。 但是在此示例中,它打算是一个静态工厂方法(带有静态导入),该方法创建一个新的Trimmed对象,该对象包装了untrimmedStrings列表。 Trimmed实现了List接口,但它几乎将所有内容都委派给包装的列表,但通常具有修饰的功能。 当添加或删除新的String时,通过对包装列表进行处理,可以对两个列表进行“合并”。 并且当它添加新的String时,可以按原样添加它,但是然后只需确保在输出时将其修剪掉即可。

另外,由于仅在从列表中提取数据时才进行修剪,因此我们不必立即完成修剪每个String的所有工作。 有可能甚至无法处理某些字符串,因此永远不会不必要地修剪那些字符串。

但是,这有一些缺点。 一种,如果修剪过的字符串多次从列表中拉出,则最终每次都会修剪。 这不会占用任何额外的内存,但是会增加一些时间,尤其是如果您遍历整个列表几次。 其次,它会产生修剪后的列表和未修剪的列表为同一列表的副作用。 无论我们是否想要,更改一个都会影响另一个。

在本文中,我不想浪费太多时间和空间来向您展示完全创建的Trimmed的List实现(为List定义了30多种方法),因此,我将对其进行调整,以便仅定义的可迭代方法。 由于在很多时候,您真正要做的只是遍历集合,因此必须相对可以接受。

public class Trimmed implements Iterable
{public static List trimmed(List base) {return base;}public Trimmed(Iterable base){this.base = base;}public Iterator iterator(){return new TrimmedIterator(base.iterator());}private Iterable base;
}class TrimmedIterator implements Iterator
{public TrimmedIterator(Iterator base){this.base = base;}public boolean hasNext(){return base.hasNext();}public String next(){return base.next().trim();}public void remove(){throw new UnsupportedOperationException();}private Iterator base;
}

如何装饰对象

我不记得有人在任何地方提及此事,但这很重要,因此我想告诉您。

关于装饰对象,有2种基本的思想流派。 第一种是当您简单地传入传入经过装饰/包装的对象来创建装饰器的新实例时。第二种方法是在要装饰的对象上调用一个方法。

这两个选项都显示在这里

MyCollection untrimmedStrings = aCollectionOfStrings();//new Decorator Instance
MyCollection trimmedStrings = new TrimmingDecorator(untrimmedStrings);//OR//method call on the to-be-decorated object
MyCollection trimmedStrings2 = untrimmedStrings.trimmed();

而且trimmed()的代码如下所示:

public MyCollection trimmed() {return new TrimmingDecorator(this);
}

每种方法都有其优点和缺点。 由于每个选项的弊端本质上都缺乏另一个选项的优点,因此我只列出每个选项的优点。

新实例专家:

  • 比方法调用选项可扩展,因为方法调用必须尝试涵盖装饰器的所有可能性
  • 用户可以更轻松地看到它是装饰器模式
  • 可修饰界面中所需的方法更少

方法调用的优点:

  • 如果用户不需要知道,则隐藏装饰器实现
  • 用户端没有明确的“新”关键字(通常被认为是不好的)
  • 用户可以轻松找到所有装饰器,因为它们都在可装饰对象的界面上列出了

Java的原始IO库是新实例装饰的一个很好的例子,而Java 8中的Stream API是方法调用装饰的一个很好的例子。 我个人的喜好是使用方法调用选项,因为它使所有可能性对用户显而易见,但是如果要这样做,则用户也可以使用自己的装饰器扩展对象,那么您绝对应该使用新的实例路由。

翻译自: https://www.javacodegeeks.com/2015/01/transforming-collections-with-decorators.html

改变数据类型的装饰器

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

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

相关文章

khoury计算机科学学院,东北大学Open House中国站

东北大学Open House中国站 -10月26日北京 & 10月27日上海东北大学向金吉列留学的学生发来诚挚邀请,欢迎您的学生前来参加东北大学于 10 月 26 日(周六)在北京 和 10 月 27 日(周日)在上海 举办的东北大学 Open House 教育展。在这两个 Open House 教育展上&…

jvm jstat_使用jstat报告自定义JVM指标集

jvm jstat我一直缺少在JStat中配置自定义标头的可能性 。 当然,有很多预定义的数据集,但是如果我们可以创建自己的数据集,那就更好了。 正如您可能已经设计的那样,我正在写这篇文章,因为这样的功能当然是可用的:)不幸的…

知识分享:值得学习的C语言经典开源项目

点击上方蓝字关注我,了解节气咨询听上去有些荒谬,C语言的产生竟然源于一个失败的项目。1969年,通用电气、麻省理工学院和贝尔实验室联合创立了一个庞大的项目——Multics工程。该项目的目的是创建一个操作系统,但显然遇到了麻烦&a…

计算机主机中网卡的作用,计算机硬件组成及作用

计算机硬件组成及作用今天百分网小编介绍一下电脑各组件,加深一下理解,让还不太懂的人可以对自己的电脑有一个整体的了解,希望对你有所帮助!一、电源电源是电脑最重要的部件,相当于人体的心脏,向所有的零部件输送血液&…

oracle idm_批准Oracle IDM中的特定Web服务

oracle idm关于Web服务端点的快速发布,OIM和SOA在与批准有关的场景中使用了Web服务端点- 基本内容,但对于初学者可能有用 。 Oracle IDM与SOA套件集成并利用其提供与批准相关的功能(说实话,SOA非常丰富,并且也被用作W…

C语言编程笔记:关于 for循环 的那些不为人知的秘密

点击上方蓝字关注我,了解更多咨询好吧,也许你认为我在写一篇如何使用for循环的文章,,,,首先,我想说无论是学习C语言还是学习java的同学都能从此文中获益,还有,你确定你会…

chrome for mac html5,javascript – Mac上的Chrome浏览器问题

我一直在寻找很长一段时间,因为画布元素上的旋转矩形的绘制,擦除和重绘在Mac上的谷歌浏览器中不起作用.我需要这个,因为我想在画布上渲染悬停叠加层.我创建了一个代表我的代码的小提琴:linkHTML:使用Javascript:var canvas null;var ctx;var …

weld焊接_玩Weld-Probe –一站式查看CDI的所有方面

weld焊接当我坐在DevConf.CZ的会议室时, Weld 3.0.0.Alpha4已发布 。 大约在Jozef Hartinger( jozefhartinger )旁边或多或少 ,后者在共享休息前几分钟告诉我有关此最新版本的新功能的信息。 有一个特别的功能真正引起了我的注意&…

C语言:一种通用的程序设计语言

点击上方蓝字关注我,了解更多咨询语言是一种通用的程序设计语言。它同UNIX系统之间具有非常密切的关系。C语言是在UNIX系统上开发的,且无论是UNIX系统本身还是其上运行的大部分程序,都是C语言编写的。但是C语言并不受限于任何一种操作系统或机…

可禁用计算机服务,win10哪些服务可以禁用 服务哪些可以禁止启动

win10服务哪些可以禁止启动?方法一:命令方法首先使用 Windows R 组合快捷键打开“运行”窗口,之后键入 services.msc 按下回车键,即可打开“服务”。方法二:快捷方式法在Win10桌面的“此电脑”图标上点击鼠标右键&…

drill apache_如何使用Apache Drill分析高度动态的数据集

drill apache当今的数据是动态的,并由应用程序驱动。 由诸如Web /社交/移动/ IOT等行业趋势驱动的新业务应用时代的增长正在生成具有新数据类型和新数据模型的数据集。 这些应用程序是迭代的,并且关联的数据模型通常是半结构化的,无模式的且不…

如何用最短的时间学会C语言,并掌握C语言的精髓所在?

点击上方蓝字关注我,了解更多咨询及C语言,我想凡是学过它的朋友都有这样一种感觉,那就是“让我欢喜让我忧。”欢喜的是,C语言功能非常强大、应用广泛,一旦掌握了后,你就可以理直气壮地对他人说“我是电脑高…

山西能源计算机专业,山西能源学院计算机科学与技术专业2016年在四川理科高考录取最低分数线...

类似问题答案四川大学计算机科学与技术专业2016年在山西理科高考录取最低分数线学校 地 区 专业 年份 批次 类型 分数 四川大学 山西 计算机科学与技术 2016 一批 理科 610 学校 地 区 专业 年份 批次 类型 分数 四川大学 山西 计算机科学与技术 2016 一批 理科 610 四川大学 山…

apache fop_Apache FOP与Eclipse和OSGi的集成

apache fopApache FOP是由XSL格式化对象( XSL-FO )驱动的开源打印处理器。 例如,将数据对象转换为PDF可能非常有用。 但是,事实证明,将其集成到PDE中并最终以OSGi Service的形式启动和运行有点麻烦。 因此&#xff0c…

2022年最值得学习的 5 种编程语言,你有在学习吗?

点击上方蓝字关注我,了解更多咨询作为一个初学者电脑程序员,很多人都会想知道当下主流的编程语言有哪些,哪些行业和公司都在用它们,因为这些信息可以帮助你了解想要学习的内容,使你更接近最终想用代码完成的事情。今天…

计算机组装名词术语解释,计算机名词解释及简答题总结

计算机名词解释及简答题总结信息技术:指的是用来扩展人们信息器官功能,协助人们更有效地进行信息处理的一类技术1.信息处理:信息的收集、加工、存储、传递、施用相关的行为和活动2.信息产业:是指生产制作信息设备,以及…

wildfly mysql_MySQL作为Kubernetes服务,可从WildFly Pod访问

wildfly mysqlKubernetes上使用Vagrant的Java EE 7和WildFly(技术提示#71)介绍了如何在使用Kubernetes和Docker托管的WildFly上运行琐碎的Java EE 7应用程序。 Java EE 7应用程序是在世界范围内交付的动手实验室 。 它使用与WildFly捆绑在一起…

想学C语言?这些你一定要知道

点击上方蓝字关注我,了解更多咨询首先,你想运行自己的C语言程序,就必须要有一个IDE(集成式开发工具)。不然想运行程序很难。这里有两个方法可以运行你的C语言程序,一个是在菜鸟网站上云运行C语言程序&#…

mongodb实验报告_Dropwizard,MongoDB和Gradle实验

mongodb实验报告介绍 我使用Dropwizard,MongoDB和Gradle创建了一个小项目。 它实际上是作为一个实验性的Guava缓存开始的,作为将计数器发送到MongoDB(或任何其他DB)的缓冲区。 我也想尝试MondleDB插件的Gradle。 接下来&#xff0…

历城职专学前计算机专业,历城职专学前教育专业2020学年第一学期技能运动会拉开帷幕...

原标题:历城职专学前教育专业2020学年第一学期技能运动会拉开帷幕技能运动会学前教育专业技能运动会1月13日,历城职专学前教育专业2020学年第一学期技能运动会拉开帷幕,技能运动会是历城职专对每一位职专学子专业技能考核的一项重要检测&…