【设计模式】责任链模式,让程序员摆脱乱糟糟的零散的代码

🤵‍♂️ 个人主页:奇想派

👨‍💻 作者简介:奇想派,十年全栈开发经验,团队负责人。喜欢钻研技术,争取成为编程达人 🎖️!

🗺️学海无涯苦作舟,🛤️编程之路无悔路!

📝 如果文章对你有帮助的话,欢迎评论💬点赞👍收藏📂加关注,不胜感激!

🚀 更多内容,点击链接扫码关注公众号👉编程达人

责任链模式&函数式编程在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个思想很好实践的能力。

🚀博主个人博客网站:奇想派

🎨文章首发平台:微信公众号【编程达人】编程达人

🔥原创不易!各位小伙伴觉得文章不错的话,可以关注我,进行评论💬点赞👍收藏📂三连走起!谢谢大家!

拜托了

posted @ 2022-10-18 19:04  奇想派  阅读(99)  评论(0编辑  收藏  举报