設計模式-責任鏈模式

Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有對象處理它爲止。)

責任鏈模式的重點是在「鏈」上,由一條鏈去處理類似的請求在鏈中決定誰來處理這個請
求,並返回相應的結果。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

 

 
image.png

抽象的處理者實現三個職責:一是定義一個請求的處理方法handlerMessage,惟一對外開放的方法;二是定義一個鏈的編排方法setNext,設置下一個處理者;三是定義了具體的請求者必須實現的兩個方法:定義本身可以處理的請假天數getHandlerLeave和具體的處理任務response。對象

責任鏈優勢:

責任鏈模式很是顯著的優勢是將請求和處理分開。請求者能夠不用知道是誰處理的,處
理者能夠不用知道請求的全貌。

責任鏈缺點:

責任鏈有兩個很是顯著的缺點:一是性能問題,每一個請求都是從鏈頭遍歷到鏈尾,特別是在鏈比較長的時候,性能是一個很是大的問題。二是調試不很方便,特別是鏈條比較長,環節比較多的時候,因爲採用了相似遞歸的方式,調試的時候邏輯可能比較複雜。

相關文章
相關標籤/搜索