【责任链模式】
也称为职责链模式。
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链模式的重点是在“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果。
【责任链模式 例子】
package com.Higgin.Handler; /** * 足球运动员抽象类 */ abstract class Player{ protected Player nextPlayer; //得到下一个足球运动员 public Player getNextPlayer() { return nextPlayer; } //设置要传递的下一个足球运动员 public void setNextPlayer(Player nextPlayer) { this.nextPlayer = nextPlayer; } //示意处理的方法 public abstract void playerRequest(); } /** * 守门员 */ class Goalkeeper extends Player{ @Override public void playerRequest() { if(nextPlayer!=null){ System.out.println("守门员:得到球后,传球..."); nextPlayer.playerRequest(); }else{ System.out.println("守门员:120码超级远射!!!"); } } } /** * 后卫 */ class Defender extends Player{ @Override public void playerRequest() { if(nextPlayer!=null){ System.out.println("后卫:得到球后,传球..."); nextPlayer.playerRequest(); }else{ System.out.println("后卫:没看到前锋,后卫远射破门!!!"); } } } /** * 前锋 */ class Striker extends Player{ @Override public void playerRequest() { if(nextPlayer!=null){ System.out.println("前锋:得到球后,传球..."); nextPlayer.playerRequest(); }else{ System.out.println("前锋,临门一脚破门!!"); } } } /** * 测试责任链模式 */ public class TestHandler { public static void main(String[] args) { Player goalkeeper=new Goalkeeper(); //守门员 Player defender=new Defender(); //后卫 Player striker=new Striker(); //前锋 goalkeeper.setNextPlayer(defender); //守门员的下一个目标是后卫 defender.setNextPlayer(striker); //后卫的下一个目标是前锋 goalkeeper.playerRequest(); //守门员得球后的行为 } }
【运行结果】
【责任链模式 优点】
责任链模式非常显著的优点是将请求和处理分开。请求者不需要知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。
【责任链模式 缺点】
* 性能问题
每个请求都是从链头遍历到链尾,特别是链较长的时候,性能是一个大问题。
* 调试不方便
同样是链条较长时,环节比较多时,由于采用了类似递归的方式,调试时的逻辑较为复杂。
【注意事项】
链中节点数量需要控制,避免出现超长链条的情况,一般的做法是在Handler中设置一个最大节点数量,在setNext方法中判断是否超过其阈值,超过则不允许该链建立,避免无意识地破坏系统性能。