設計模式-行爲型- 責任鏈模式(Chain of Responsibility)

定義

使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係,將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有對象處理它爲止

       if…else進行判斷處理非常直觀、容易理解,而且很容易維護,但是如果處理的邏輯比較複雜時,就面臨着代碼臃腫的問題了, 而且代碼的耦合度也較高。鑑於這些問題,責任鏈模式應運而生

角色

抽象處理者(Handler):定義出一個處理請求的接口。包含一個返回下一個處理類的方法和處理請求的方法,處理請求方法的思想是,如果滿足條件,則由本處理類來處理,否則就把請求拋給下一個處理類

具體處理者:對抽象處理者進行實現,並加入處理邏輯

優點

  • 相對於if…else,它的耦合度低
  • 相對於if…else,責任鏈模式更加的靈活

缺點

  • 如果處理過程比較簡單,使用責任鏈模式增加了太多的類
  • 在找到處理類之前,所有的判定條件都要被執行一遍(if…else也有這個問題)
  • 抽象處理者 Handler 類中的 handleRequest() 方法中使用了遞歸,耗費棧空間

適用場景

  • 當使用if…else使代碼臃腫的時候

       個人感覺職責鏈模式對於請求的處理是不知道最終處理者是誰,所以是運行動態尋找並指定,也就是一個if…else的靈活版;而命令模式中對於命令的處理時在創建命令是已經顯式或隱式綁定了接收者

類圖

Chain of Responsibility

package com.vapy.behavior.ChainOfResponsibility;

/**
 * 
 * @author vapy
 * 
 */
public class Level {
    private int level = 0;

    public enum UserRights {
        READ(1), ADD(2), CHANGE(2), UPDATE(2), DELETE(3);
        private int code;

        private UserRights(int code) {
            this.code = code;
        }

        public int getCode() {
            return code;
        }
    }

    public Level(String str) {
        for (UserRights s : UserRights.values()) {
            if (str.equalsIgnoreCase(s.name())) {
                this.level = s.getCode();
            }
        }
        if (level == 0) {
            level = Integer.MAX_VALUE;
        }
    }

    public boolean above(Level level) {
        if (this.level >= level.level) {
            return true;
        }
        return false;
    }
}
package com.vapy.behavior.ChainOfResponsibility;

/**
 * 
 * @author vapy
 * 
 */
public class Request {
    Level level;

    public Request(Level level) {
        this.level = level;
    }

    public Level getLevel() {
        return level;
    }
}
package com.vapy.behavior.ChainOfResponsibility;

/**
 * 
 * @author vapy
 * 
 */
public abstract class Handler {
    private Handler nextHandler;

    public final void handleRequese(Request request) {
        if(this.getHandlerLevel().above(request.getLevel())) {
            this.response(request);
        } else {
            if(this.nextHandler != null) {
                this.nextHandler.handleRequese(request);
            } else {
                System.out.println("沒有合適處理器");
            }
        }
    }

    public void setNextHandler(Handler handler) {
        this.nextHandler = handler;
    }

    protected abstract Level getHandlerLevel();

    public abstract void response(Request request);
}
package com.vapy.behavior.ChainOfResponsibility;

/**
 * 
 * @author vapy
 * 
 */
public class OrdinaryUser extends Handler {
    @Override
    protected Level getHandlerLevel() {
        return new Level("READ");
    }

    @Override
    public void response(Request request) {
        System.out.println("我是普通用戶,由我便可執行READ操作");
    }
}
package com.vapy.behavior.ChainOfResponsibility;

/**
 * 
 * @author vapy
 * 
 */
public class Administrators extends Handler {
    @Override
    protected Level getHandlerLevel() {
        //ADD, CHANGE, UPDATE得到的level.level均爲2,所以此處傳參數ADD即可
        return new Level("ADD");
    }

    @Override
    public void response(Request request) {
        System.out.println("我是管理員,由我便可執行ADD、CHANGE、UPDATE操作");
    }
}
package com.vapy.behavior.ChainOfResponsibility;

/**
 * 
 * @author vapy
 * 
 */
public class Root extends Handler {
    @Override
    protected Level getHandlerLevel() {
        return new Level("DELETE");
    }

    @Override
    public void response(Request request) {
        System.out.println("我是ROOT,只有我可以執行DELETE操作");
    }
}
package com.vapy.behavior.ChainOfResponsibility;

/**
 * 
 * @author vapy
 * 
 */
public class Client {
    public static void main(String[] args) {
        Handler handler1 = new OrdinaryUser();
        Handler handler2 = new Administrators();
        Handler handler3 = new Root();

        handler1.setNextHandler(handler2);
        handler2.setNextHandler(handler3);

        handler1.handleRequese(new Request(new Level("read")));
        handler1.handleRequese(new Request(new Level("change")));
        handler1.handleRequese(new Request(new Level("DELETE")));
    }
}

ChainOfResponsibilityResult
本文代碼可在github查看:點擊此處

發佈了55 篇原創文章 · 獲贊 29 · 訪問量 123萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章