最后,你就可以在Client中将这上面两个具体的操作类对象构成一个操作序列,参见下面的代码:
public class Client { public static void main(String[] args) { ProcessingObject<String> p1 = new HeaderTextProcessing(); ProcessingObject<String> p2 = new SpellCheckerProcessing(); p1.setSuccessor(p2); String result = p1.handler("Aren't labdas really sexy?!!"); System.out.println(result); } } 函数式编程思路如果使用函数式编程思维,那么职责链模式就直接了——y=f(x)和z=g(x)这两个方法都是要对x做处理,那么如果将这两个函数组合在一起,就会形成r=f(g(x))的情况,也就是可以使用Lambda表达式中的addThen来串联起多个处理过程。
public class ClientWithLambda { public static void main(String[] args) { UnaryOperator<String> headerProcessing = (String text) -> "From Raoul, Mario and Alan: " + text; UnaryOperator<String> spellCheckProcessing = (String text) -> text.replace("labda", "lambda"); Function<String, String> function = headerProcessing.andThen(spellCheckProcessing); String result = function.apply("Aren't labdas really sexy?!!"); System.out.println(result); UnaryOperator<String> hhhhhProcessing = (String text) -> text.concat("hhhh"); Function<String, String> function1 = function.andThen(hhhhhProcessing); String result1 = function1.apply("Aren't labdas really sexy?!!"); System.out.println(result1); } }上面是利用Java原生的Lambda表达式实现的职责链模式,我们也可以使用前面一篇文章——中介绍过的vavr库来实现,代码如下所示:
public class ClientWithVavr { public static void main(String[] args) { Function1<String, String> headerProcessing = (String text) -> "From Raoul, Mario and Alan: " + text; Function1<String, String> specllCheckProcessing = (String text) -> text.replace("labda", "lambda"); Function1<String, String> function = headerProcessing.compose(specllCheckProcessing); String result = function.apply("Aren't labdas really sexy?!!"); System.out.println(result); } } 总结可以看出,函数式编程思维跟面向对象编程思维的思考方式是不同的,表达力更强,因此,作为开发者是时候认真学习下函数式编程思维了,作为Java开发者,我准备先从Lambda表达式开始学起,然后尝试学习下Scala或Kotlin两门语言中的函数式编程特性。
参考资料《Java编程实战》
《设计模式之禅》
本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。