一 場景
想象一個求職過程:
(1)求職者(Client)提交簡歷給機器進行第一次篩選,篩選成功後提交給主管。
(2)主管進行一輪面試,對簡歷再次評級,拒絕評級差的,評級好的提交給經理。
(3)經理進行二輪面試,對簡歷再次評級,拒絕評級差的,評級好的提交給總監。
(4)總監進行三輪面試,對簡歷再次評級,拒絕評級差的,評級好的通過面試(hr面暫時免了)。
二 代碼
對上述場景進行模擬的代碼,當然你可以用一系列if和else去模擬這個場景,但是那樣的話代碼會很難看,耦合太強,太亂。。。所以我模仿責任鏈寫了:
抽象處理類:
public abstract class Handler { protected Handler successor=null; public Handler getSuccessor(){ return successor; } public void setSuccessor(Handler successor){ this.successor=successor; } public abstract String handleResume(String name, String level); }
主管處理類:
經理處理類:public class SupervisorHandler extends Handler { @Override public String handleResume(String name, String level) { String result=""; String newLevel="C";//主管進行一輪面試重新評定簡歷等級,簡單起見評定爲A if(newLevel.equals("D")){ result+=name+"已被回絕"; } else{ if(getSuccessor()!=null){ return getSuccessor().handleResume(name, newLevel); } } return result; } }
總監處理類:public class ManagerHandler extends Handler { @Override public String handleResume(String name, String level) { String result=""; String newLevel="A";//部門經理二輪面試重新評定等級 if(newLevel.equals("C")){ result+=name+"已被回絕"; } else{ if(getSuccessor()!=null){ return getSuccessor().handleResume(name, newLevel); } } return result; } }
客戶類:public class ChiefHandler extends Handler { @Override public String handleResume(String name, String level) { String result=""; String newLevel="A";//總監進行三輪面試評定等級 if(newLevel.equals("A")){ result+=name+",恭喜你通過面試!"; } else { result+=name+"已被回絕"; } return result; } }
public class Client { public static void main(String[] args){ Handler chief=new ChiefHandler(); Handler manager=new ManagerHandler(); Handler supervisor=new SupervisorHandler(); supervisor.setSuccessor(manager); manager.setSuccessor(chief); //簡歷通過機器篩選並評定爲A String result=supervisor.handleResume("xiaoming", "D"); System.out.println(result); } }
三 相關理論
3.1定義
看了實際的應用場景和代碼,責任鏈已經不難理解了,是時候看看理論定義了,百度百科如是說:責任鏈模式是一種設計模式。在責任鏈模式裏,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
3.2純與不純的責任鏈
純的責任鏈模式要求一個具體的處理者對象只能有兩個行爲:要麼承擔責任,要麼把責任推給下家。不允許出現某一個具體處理者對象在承擔了一部分責任後又把責任向下傳的情況。並且一個請求必須被某一個處理者對象所接收;不純的責任鏈模式裏面,一個請求可以最終不被任何接收端對象所接收。純的責任鏈模式的實際例子很難找到,一般看到的例子均是不純的責任鏈模式的實現。
四 該模式包含的角色
4.1抽象處理者角色(Handler)
定義出一個處理請求的接口。如果需要,接口可以定義 出一個方法以設定和返回對下家的引用。這個角色通常由一個Java抽象類或者Java接口實現。
4.2具體處理者角色(ConcreteHandler)
具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。
4.3客戶類
需要指定怎麼鏈。可以跳過某一鏈,還可以越級。
五 爲何要責任鏈
5.1 改變內部的傳遞規則
在內部,超級優秀的簡歷直接給總監就好。
5.2 可以從職責鏈任何一關開始
主管離職了,簡歷直接由經理篩選吧。
5.3總結一下
不用職責鏈的結構,client需要和公司中的每一個層級都發生耦合關係。反映在代碼上就是我們需要在一個類中去寫上很多的if….else語句。用了職責鏈,只需要認識其中的一個層級,然後讓讓他處理或者傳遞給其他層級就好。