图1:设计模式-Chain of Responsibility(责任链模式).png
特点
1、每一个处理器都持有下一个处理器next,当当前处理器能处理时,则处理;当不能处理时,调用next进行处理;
2、在调用方,用next的顺序,决定处理器的处理顺序;
应用场景
当同一类问题,可能有不同的处理方式,但每一种条件只对应唯一一种处理方式时,可以使用责任链模式:
1、web浏览器、windows窗口等,事件传递的实现。(当同一个区域有多个组件层叠时,通过责任链模式,来决定应该由哪一个组件来响应鼠标的“点击”事件)
2、面试常问题:如果代码中if else过多,该如何优化?责任链模式可以优雅地解决这个问题;
思考
标准的责任链模式(如上图1所示)中,需要使用next来决定处理顺序,而且在request方法内部还要写与调用顺序相关的代码,简直太麻烦了。
然而java中,天然具有“有序性”的东西是什么呢??
这就带来了更简单的使用方式(仅属个人浅见):
Trouble t = new Trouble();
List<AbstractHandler> handlerList = new LinkedList<>();
handlerList.add(new ConcreteHandler1(t));
handlerList.add(new ConcreteHandler2(t));
handlerList.add(new ConcreteHandler3(t));
...
for(int i = 0;i < handlerList.size(); i++){
AbstractHandler handler = handlerList.get(i);
if(handler.isAbleToHandler(t)){
handler.handle(t);
break;
}
if(i == handlerList.size() - 1){
throw new RuntimeException("未找到能处理的处理器,处理失败!");
}
}
https://www.processon.com/view/link/5f2c109c5653bb1b611515ab