責任鏈模式的重點是在「鏈」上,由一條鏈去處理類似的請求在鏈中決定誰來處理這個請
求,並返回相應的結果。java
對上面字面意思理解可能很模糊,咱們舉一個簡單例子。
以員工請假爲例,老闆能夠批假5天,經理能夠批假3天,組長能夠批假1天。ide
Handler性能
/** * @author shuliangzhao * @Title: Handler * @ProjectName design-parent * @Description: TODO * @date 2019/6/11 23:01 */ public abstract class Handler { public final static int BOSS_LEAVE = 5; public final static int MANAGER_LEAVE = 3; public final static int GROUP_LEADER_LEAVE = 1; private int level; public Handler(int level) { this.level = level; } //責任傳遞,下一責任人 private Handler nextHandler; public final void handlerMessage(Employee employee) { if (employee.getLeave() == level) { this.response(employee); }else { if (this.nextHandler != null) { if (this.nextHandler.level == employee.getLeave()) { this.nextHandler.response(employee); }else { System.out.println("沒人批准了,請準確提假期天數"); } }else { System.out.println("沒人批准了,請準確提假期天數"); } } } public void setHandler(Handler handler) { this.nextHandler = handler; } public abstract void response(Employee employee); }
Bossthis
/** * @author shuliangzhao * @Title: Boss * @ProjectName design-parent * @Description: TODO * @date 2019/6/11 23:21 */ public class Boss extends Handler { public Boss() { super(BOSS_LEAVE); } @Override public void response(Employee employee) { System.out.println("員工找老闆請假"); System.out.println(employee.getRequest()); System.out.println("老闆贊成批假" + BOSS_LEAVE + "天"); } }
Managerspa
/** * @author shuliangzhao * @Title: Manager * @ProjectName design-parent * @Description: TODO * @date 2019/6/11 23:24 */ public class Manager extends Handler { public Manager() { super(MANAGER_LEAVE); } @Override public void response(Employee employee) { System.out.println("員工找經理請假"); System.out.println(employee.getRequest()); System.out.println("經理贊成批假" + MANAGER_LEAVE + "天"); } }
GroupLeader3d
/** * @author shuliangzhao * @Title: GroupLeader * @ProjectName design-parent * @Description: TODO * @date 2019/6/11 23:26 */ public class GroupLeader extends Handler { public GroupLeader() { super(GROUP_LEADER_LEAVE); } @Override public void response(Employee employee) { System.out.println("員工找組長請假"); System.out.println(employee.getRequest()); System.out.println("組長贊成批假" + GROUP_LEADER_LEAVE + "天"); } }
Employee調試
/** * @author shuliangzhao * @Title: Employee * @ProjectName design-parent * @Description: TODO * @date 2019/6/11 23:05 */ public class Employee { //請假 private int leave; private String request; public Employee(int leave,String request) { this.leave = leave; this.request = request; } public int getLeave() { return leave; } public void setLeave(int leave) { this.leave = leave; } public String getRequest() { return request; } }
客戶端code
/** * @author shuliangzhao * @Title: Client * @ProjectName design-parent * @Description: TODO * @date 2019/6/11 23:29 */ public class Client { public static void main(String[] args) { Handler boss = new Boss(); Handler manager = new Manager(); Handler groupLeader = new GroupLeader(); boss.setHandler(manager); manager.setHandler(groupLeader); Employee employee = new Employee(6,"端午節回家"); boss.handlerMessage(employee); } }
運行結果orm
抽象的處理者實現三個職責:一是定義一個請求的處理方法handlerMessage,惟一對外開放的方法;二是定義一個鏈的編排方法setNext,設置下一個處理者;三是定義了具體的請求者必須實現的兩個方法:定義本身可以處理的請假天數getHandlerLeave和具體的處理任務response。對象
責任鏈模式很是顯著的優勢是將請求和處理分開。請求者能夠不用知道是誰處理的,處
理者能夠不用知道請求的全貌。
責任鏈有兩個很是顯著的缺點:一是性能問題,每一個請求都是從鏈頭遍歷到鏈尾,特別是在鏈比較長的時候,性能是一個很是大的問題。二是調試不很方便,特別是鏈條比較長,環節比較多的時候,因爲採用了相似遞歸的方式,調試的時候邏輯可能比較複雜。