首先强调的是责任和链。每一个节点只负责自己需要完成的工作,符合单一职责原则。而链呢强调的是它们是一个整体,信息从第一个节点开始可以向后边的节点进行传递,这些节点是有序的,但要保证构成一条完整的链路。所以它的优点很显然,适合处理一些串行化任务(一定是有序的),常见的拦截器就是如此。但同样,大家都知道串行化是很慢的,所以在处理一些并行化任务(无序的,哪个任务在前哪个任务在后对处理结果并不影响)时更多的要考虑采用并行框架的方式去解决问题。还有就是要保证链路的高可靠性,一定是可以从头到尾的,形成完整一条线。
代码如下:
public class DutyChain {
public static void main(String[] args) {
FirstPassHandler firstPassHandler = new FirstPassHandler();//第一关
SecondPassHandler secondPassHandler = new SecondPassHandler();//第二关
ThirdPassHandler thirdPassHandler = new ThirdPassHandler();//第三关
// 和上面没有更改的客户端代码相比,只有这里的set方法发生变化,其他都是一样的
firstPassHandler.setNext(secondPassHandler);//第一关的下一关是第二关
secondPassHandler.setNext(thirdPassHandler);//第二关的下一关是第三关
//从第一个关卡开始
firstPassHandler.handler();
}
}
abstract class AbstractHandler {
/**
* 下一关用当前抽象类来接收
*/
protected AbstractHandler next;
public void setNext(AbstractHandler next) {
this.next = next;
}
public abstract int handler();
}
class FirstPassHandler extends AbstractHandler{
private int play(){
return 80;
}
@Override
public int handler(){
System.out.println("第一关-->FirstPassHandler");
int score = play();
if(score >= 80){
//分数>=80 并且存在下一关才进入下一关
if(this.next != null){
return this.next.handler();
}
}
return score;
}
}
class SecondPassHandler extends AbstractHandler{
private int play(){
return 90;
}
public int handler(){
System.out.println("第二关-->SecondPassHandler");
int score = play();
if(score >= 90){
//分数>=90 并且存在下一关才进入下一关
if(this.next != null){
return this.next.handler();
}
}
return score;
}
}
class ThirdPassHandler extends AbstractHandler{
private int play(){
return 95;
}
public int handler(){
System.out.println("第三关-->ThirdPassHandler");
int score = play();
if(score >= 95){
//分数>=95 并且存在下一关才进入下一关
if(this.next != null){
return this.next.handler();
}
}
return score;
}
}