在前不久发的「 Java 中模拟 C# 的扩展方法 」一文中给 Java 模拟了扩展方法。但毕竟没有语法支持,使用起来还是有诸多不便,尤其是需要不断交错使用不同类中实现的“扩展方法”时,切换对象非常繁琐。前文也提到,之所以想到研究“扩展方法”其实只是为了“链式调用”。
那么,为什么不直接从原始需求出发,只解决链式调用的问题,而不去考虑更宽泛的扩展方法呢?前文研究过通过 Builder 模式来实现链式调用,这种方式需要自己定义扩展方法类(也就是 Builder),仍然比较繁琐。
Chain 雏形
链式调用的主要特点就是使用了某个对象之后,可以继续使用该对象 …… 一直使用下去。你看,这里就两件事:一是提供一个对象;二是使用这个对象 —— 这不就是 Supplier 和 Consumer 吗?Java 在 java.util.function
包中正好提供了同名的两个函数式接口。这样一来,我们可以定义一个 Chain
类,从一个 Supplier 开始,不断的“消费”它,这样一个简单的 Chain
雏形就出来了:
public class Chain<T> { private final T value; public Chain(Supplier<? extends T> supplier) { this.value = supplier.get(); } public Chain<T> consume(Consumer<? super T> consumer) { consumer.accept(this.value); return this; } }
现在,假如我们有一个 Person
类,它有一些行为方法:
class Person { public void talk() { } public void walk(String target) { } public void eat() { } public void sleep() { } }
还是前文中那个业务场景:谈妥了,出去&