程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

《Java8实战》之行为参数化学习与总结

发布于2021-06-12 14:17     阅读(313)     评论(0)     点赞(22)     收藏(0)


扫描关注公众号查看更多内容
在这里插入图片描述

近期在研读《Java 8 in Action》中文版(中文《java8实战》),感觉受益良多,故想向大家分享这本书籍,并写下自己的对于其中的理解。

在这里插入图片描述

前言

不知道大家在日常工作中当有一个需求在与客户讨论时,客户对于同一个功能的需求总是在变,或者是一段时间内需要这个,过一段时间又变成那个。
在这里插入图片描述
例如:当有个疫情级别城市查询,一开始想当1<疫情人数<5为中风险城市,你可能会这样写个方法

public String midLevelCity(People people){
	if( 1 < people.getNumber() < 5){
		return mid;
	}else{
		//其他情况
	}
}

后面客户又想变成依靠疫情人数和地区人数的比例去计算的时候你怎么办,你是否是想每次都去变更这个方法呢?或者是在写一个midLevelCityNew(People people)的方法吗?在下下次又想变成人数或者比例的条件呢?
都是去变更方法吗?这样可不符合开闭原则!!

在面向对象编程领域中,开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。

在这里插入图片描述
这时候行为参数化的作用就来了

详细代码

首先 我们创建一个接口,专门为这个行为“负责”

public interface  MidLevelCity {
	public boolean test(People people);
}

然后为每个可能需要的条件实现一个接口

public interface  MidNumLevelCity implements  MidLevelCity {
	public boolean test(People people){
		return  1 < people.getNumber() < 5;
	}
}
public interface  MidNumAndTotalLevelCity implements  MidLevelCity {
	public boolean test(People people){
		return   people.getNumber()/people.getTotal() < 0.00001;
	}
}

如有更多可能的条件,都可依此创建
然后写个方法

public String midLevelCity(People people , MidLevelCity mid){
	if(mid.test(people){
		return "mid";
	}else{
		//其他情况
	}
}

这样 只需在传参时更改具体实现类即可,无需变更逻辑代码。

在这里插入图片描述
现在还能优化吗?答案是可以的
如我们看到了,这每次如果要变新的条件的话都要创建一个新的实现类,那岂不是也很繁琐
在这里插入图片描述
那么,就到了我们使用匿名内部类的时候了

匿名内部类可以使你的代码更加简洁,你可以在定义一个类的同时对其进行实例化。它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要用一次,那么你就可以使用匿名内部类

我们每次调用时这样调用使用匿名内部类不就可以了,如下

 xxx.midLevelCity(People people , new MidLevelCity(){
		public boolean test(People people){
		return  1 < people.getNumber() < 5;
	}
}

Bingo!!!
这样就是最佳了吗?当然不是
在这里插入图片描述
再一次尝试,我们可以是用lambda表达式来使代码更加简洁

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。

但是我们要注意的是,只有函数式接口才能使用lambda表达式,通俗来讲,函数式接口就是只有一个函数的接口。

 xxx.midLevelCity(People people ,People people) ->   1 < people.getNumber() < 5;

这样是不是最特别简洁明了了呀!!

小结

1.行为参数化,就是一个方法接受多个不同的行为作为参数,并在内部使用他们,完成不同行为的能力。
2.行为参数化可让代码更好的适应不断变化的要求,减轻未来的工作量。
在这里插入图片描述

原文链接:https://blog.csdn.net/weixin_45115928/article/details/117736752



所属网站分类: 技术文章 > 博客

作者:java小王子

链接:http://www.javaheidong.com/blog/article/222099/cf2bc2e67a175da1f81c/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

22 0
收藏该文
已收藏

评论内容:(最多支持255个字符)