责任链解决的问题
一种创建处理对象序列(比如操作序列)的通用方案。一个处理对象可能需要在完成一些工作之后,将结果传递给另一个对象,这个对象接着做一些工作,在转交给下一个处理对象。依此类推
首先创建ProcessingObject类
public abstract class ProcessingObject<T> {
protected ProcessingObject<T> successor;
public void setSuccessor(ProcessingObject<T> successor) {
this.successor = successor;
}
public T handle(T input){
T r = handleWork(input);
if (successor != null){
return successor.handle(r);
}
return r;
}
abstract protected T handleWork(T input);
}
创建两个实现类
public class HeaderTextProcessing extends ProcessingObject<String>{
@Override
protected String handleWork(String input) {
return "HeaderTextProcessing:" + input;
}
}
public class SpellCheckerProcessing extends ProcessingObject<String>{
@Override
protected String handleWork(String input) {
return "SpellCheckerProcessing:" + input;
}
}
调用责任链
public static void main(String[] args){
ProcessingObject<String> p1 = new HeaderTextProcessing();
ProcessingObject<String> p2 = new SpellCheckerProcessing();
p1.setSuccessor(p2);
String result = p1.handle("contet");
System.out.println(result);
}
最后输出
如果需要修改责任链逻辑可以修改ProcessingObject中的handle()方法,可以在在处理handle之前或者之后添加筛选器,用以增强handle功能
Java8 中的实现
UnaryOperator<String> headprocessing = text -> "HeaderTextProcessing:" + text;
UnaryOperator<String> spellCheckerrocessing = text -> "SpellCheckerProcessing:" + text;
Function<String,String> pipeline = headprocessing.andThen(spellCheckerrocessing);
String result = pipeline.apply("content");
System.out.println(result);
这个模式就是在连接函数,使用andThen就可以起到连接作用