【设计模式】责任链模式,让程序员摆脱乱糟糟的零散的代码
🤵♂️ 个人主页:奇想派
👨💻 作者简介:奇想派,十年全栈开发经验,团队负责人。喜欢钻研技术,争取成为编程达人 🎖️!
🗺️学海无涯苦作舟,🛤️编程之路无悔路!
📝 如果文章对你有帮助的话,欢迎评论💬点赞👍收藏📂加关注,不胜感激!
🚀 更多内容,点击链接扫码关注公众号👉编程达人
责任链模式&函数式编程在java中的实践
在java中借用javascript大规模使用的functional programming
基础思想-函数式编程
什么是函数式编程?
-
函数式编程是一种编程的范式(A programming paradigm.)。就像面向过程、面向对象。总的来说,Function is King,函数为王。
-
函数式编程是一种思维模式。该使用什么样的方式去解决你的问题?就像你不想去破解一个代码块完整性(内聚),那么你可以加入一个切面,去影响该代码块的执行结果。
为什么要函数式编程?
- Object-oriented in javascript gets tricky. 在复杂的处理过程中,java的面向对象也许不能很好处理繁琐,复杂得业务逻辑,对象往往纠缠不清。
- Safer, easier to debug/maintain. 可维护性更高。
如何去函数式编程?
-
Do everything in function:以函数方式思考。对于一个业务逻辑,如果以函数的角度思考,那么可以抽离出若干的函数进行处理,而非乱糟糟的零散的代码
-
规定好Input/Output。一个函数规定好IO,就能去更好地承接上下游业务,更好地区分模块。
-
下面就是标准的函数式编程
var name = "alan";
function greet(){
name = "jade";
return "Hi,I'm "+name;
}
function sayMyName(name){
return "Hi,I'm "+name;
}
greet();
sayMyName(name);
=> "Hi,I'm alan "
责任链模式在jdk8中的实践
在有了上面的函数式编程的思想,接下来结合jdk的Function语法糖,可以产生很强的实战性代码
下面以一个 赚钱---> 买西红柿 ----> 洗西红柿 ----> 切西红柿----> 煮西红柿 的例子。
完整的例子
public class PipleLineTest {
static class Money{}
static class RawTomato{}
static class CleanTomato{}
static class TomatoSlice{}
static class CookedTomato{}
final static Supplier<Money> makeMoney = ()->{
System.out.println("我要努力赚钱买西红柿!!");
Money money = new Money();
System.out.println("赚到钱了,返回一堆钱");
return money;
};
final static Function<Money,RawTomato> buyRawTomato = (money)-> {
System.out.println("去市场买西红柿!");
final RawTomato rawTomato = new RawTomato();
System.out.println("买好西红柿了,得到了一个有泥的西红柿,需要洗一下,回家!");
return rawTomato;
};
final static Function<RawTomato,CleanTomato> cleanTomato = (rawTomato)-> {
System.out.println("回到家,准备洗西红柿!");
final CleanTomato cleanTomato1 = new CleanTomato();
System.out.println("洗好西红柿了!返回一个干净的西红柿");
return cleanTomato1;
};
final static Function<CleanTomato,TomatoSlice> cutTomato = (cleanTomato)-> {
System.out.println("准备切西红柿!");
final TomatoSlice tomatoSlice = new TomatoSlice();
System.out.println("切好西红柿了!返回西红柿切片");
return tomatoSlice;
};
final static Function<TomatoSlice,CookedTomato> cookTomato = (tomatoSlice)-> {
System.out.println("准备烹饪西红柿!");
final CookedTomato cookedTomato = new CookedTomato();
System.out.println("西红柿了煮好了!返回了一个煮好的西红柿,开饭!");
return cookedTomato;
};
public static void main(String[] args){
final Money money = makeMoney.get();
buyRawTomato
.andThen(cleanTomato)
.andThen(cutTomato)
.andThen(cookTomato)
.apply(money);
}
}
由上面可以看出,【煮西红柿】这个完整的步骤每一个步骤的输入输出都非常明确,维护的时候,就可以清晰看到哪个步骤需要调整/修改了。并且强制你去思考输入输出,会规范你的代码,提高可读性。
总结
使用函数式编程,可以很好地模块化每个步骤的代码。而责任链可以很好地承接我们的业务逻辑,而JDK8的函数式语法糖就赋予这2个思想很好实践的能力。
🚀博主个人博客网站:奇想派
🎨文章首发平台:微信公众号【编程达人】
🔥原创不易!各位小伙伴觉得文章不错的话,可以关注我,进行评论💬点赞👍收藏📂三连走起!谢谢大家!