文章是个人阅读《Java8实战》过程中的重点摘抄,可能晦涩,没有示例代码,后续会补充总结完善。
文章目录
本章内容
- 应对不断变化的需求
- 行为参数化
- 匿名类
- Lambda表达式预览
- 真实示例
核心问题
1.什么是行为参数化?2.行为参数化的意义是什么?
3.java8之前是怎么实现行为参数化的?
4.java8版本如何实现行为参数化?
5.是java的什么特性来支持行为参数化的?
概述
行为参数化是应对需求频繁变化的一种开发模式,这意味着将一段准备好的代码块放在未来去执行。
2.1 应对不变的需求
列举一个不断化的需求:对于一个苹果的列表进行查询,这个查询功能的要求会随时变化。可能需求查询绿色苹果,也可能是红色苹果,也可能是要求查询重量大于150g的苹果,亦或者查询查询绿色且重量大于150g的苹果,这是一个不断变化的需求。
在最初的版本中可能是一个需求一个单独的方法,但是这样的就会复制很多相同的代码,只有其中的选择条件是不同的。这样一点变更,可能需要所有的方法进行变更。也可能会有其他想法,通过传递一个参数取传递,然后通过判断参数来执行不同的代码,来屏蔽部分代码的冗余。
2.2 行为参数化
2.2.1 实现行为参数化
以行为参数化的方式解决这个需求变化的问题,请出封装、继承、多态三位大佬。
首先从更高的层次来看,需要根据苹果的属性来返回一个boolean值。让我们来定义一个接口ApplePredicate,并在接口中定义一个接收苹果作为参数返回boolean的方法do,然后定义不同的行为类并实现接口和实现方法(封装和继承)。*这一些列的做法就是使用了”策略模式“:定义一组算法,把每个算法进行封装,然后在运行的时候动态选择具体的算法。*然后我们怎么使用这些不同的实现类呢?我们的做法是定义一个接收苹果列表和算法接口对象作为参数的filterApples方法,让方法接收多行为作为参数,并在内使用来完成不行的行为,这就是行为参数化(多态)。
2.2.2 实现后的问题
我们已经把filterApples方法实现了行为参数化,但是由于此方法只能接收对象,我们将行为包裹在ApplePredicate对象中。通过行为参数化,把迭代集合的逻辑和应用到集合每个元素的行为分开了,这样可以重复使用一个方法,给他不同的行为来达到不同的目的,这就是行为参数化的意义。但是这个过程中要实例化很多使用一次的类(策略类),这样很罗嗦,接下来我们就要解决这个啰嗦的问题。
2.3 对付啰嗦
2.3.1 匿名类
java有一个机制称为匿名类,匿名类允许同时声明和初始化一个类,改善代码的复杂度,让代码变得简洁。匿名类从某中程度上改善了为一个接口声明好几个实现类的啰嗦行为。匿名类还是比较笨重,并且不好理解。
2.3.2 使用Lambda表达式
使用Lambda表达式,仅仅将代码块作为参数传递。Lambda作为匿名内部类的简写形式,传递的是代码块,匿名内部类时传递的对象。
lambda表达式是语法糖,但并不是匿名类/内部类的语法糖。
2.4 真实的例子
通过以上示例,充分阐释了行为参数是一个很重要的模式,他能够轻松的适应需求的变化。
通过三个示例来巩固代码传递的思想:用一个Comparator排序,用Runnable执行一点代码块,一个GUI事件处理。
2.5 小节
- 行为参数化,就是一个方法接收不同的行为作为参数,并在内部使用它们,完成不同的行为,得到不用的结果。
- 行为参数化可以更好的应对不断变化的需求,减轻未来的工作量。
- 传递代码,就是将行为作为参数传递给方法。java8之前,可以通过为接口声明多个一次性类来啰嗦实现,也可以通过匿名类来实现。
- jdkAPI中包含很多可以接收行为参数化的方法,包括排序、线程、GUI处理。
来源:CSDN
作者:雨露均沾"
链接:https://blog.csdn.net/u013273656/article/details/103796643