14_责任链模式

【责任链模式】

也称为职责链模式。

使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

责任链模式的重点是在“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果。

【责任链模式 例子】

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方法中判断是否超过其阈值,超过则不允许该链建立,避免无意识地破坏系统性能。

原文地址:https://www.cnblogs.com/HigginCui/p/6227478.html