LieBrother原文:
行爲型模式:責任鏈模式java
十一大行爲型模式之四:責任鏈模式。git
姓名 :責任鏈模式程序員
英文名 :Chain of Responsibility Patterngithub
價值觀 :責任歸我面試
我的介紹 :
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.
使多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有對象處理它爲止。
(來自《設計模式之禪》)設計模式
快要金三銀四了,不少同窗蠢蠢欲動想要去外面看看世界,而你們有沒有提早了解各大企業的面試流程呢?這裏我就給你們科普一下大多數互聯網企業的面試流程,正好責任鏈模式用得上。dom
在互聯網企業中,程序員這個崗位的招聘流程大同小異,而通常至少都會有 3 輪面試,分別是 2 輪技術面和 1 輪 HR 面。而這幾輪面試都是層層遞進的,最開始面試通常是組長面試,經過以後就是部門領導面試,再經過以後就是 HR 面試,HR 面試經過以後就能夠成功拿到 Offer 了。ide
故事從小明參加某公司的面試開始,某公司的招聘流程就是上面說的 3 輪面試。招聘流程的面試官分別是:第一面是組長老剛,第二面是部門經理老孫,第三面也就是終面是 HR 老劉。爲何說這個場景符合責任鏈模式呢?首先無論是組長仍是部門經理仍是 HR,他們都做爲面試官,面試官賦予他們的權利是去面試來公司面試的同窗,而面試的結果是可傳遞性的,也就是若是面試經過,就會到下一輪面試,最終成爲一條傳遞鏈。咱們用代碼模擬這個過程。學習
public class ChainOfResponsibilityTest { public static void main(String[] args) { Interviewee interviewee = new Interviewee("小明"); TeamLeader teamLeader = new TeamLeader("老剛"); DepartMentManager departMentManager = new DepartMentManager("老孫"); HR hr = new HR("老劉"); // 設置面試流程 teamLeader.setNextInterviewer(departMentManager); departMentManager.setNextInterviewer(hr); // 開始面試 teamLeader.handleInterview(interviewee); } } /** * 面試者 */ class Interviewee { private String name; private boolean teamLeaderOpinion; private boolean departMentManagerOpinion; private boolean hrOpinion; public Interviewee(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isTeamLeaderOpinion() { return teamLeaderOpinion; } public void setTeamLeaderOpinion(boolean teamLeaderOpinion) { this.teamLeaderOpinion = teamLeaderOpinion; } public boolean isDepartMentManagerOpinion() { return departMentManagerOpinion; } public void setDepartMentManagerOpinion(boolean departMentManagerOpinion) { this.departMentManagerOpinion = departMentManagerOpinion; } public boolean isHrOpinion() { return hrOpinion; } public void setHrOpinion(boolean hrOpinion) { this.hrOpinion = hrOpinion; } } /** * 面試官 */ abstract class Interviewer { protected String name; protected Interviewer nextInterviewer; public Interviewer(String name) { this.name = name; } public Interviewer setNextInterviewer(Interviewer nextInterviewer) { this.nextInterviewer = nextInterviewer; return this.nextInterviewer; } public abstract void handleInterview(Interviewee interviewee); } /** * 組長 */ class TeamLeader extends Interviewer { public TeamLeader(String name) { super(name); } @Override public void handleInterview(Interviewee interviewee) { System.out.println("組長[" + this.name + "]面試[" + interviewee.getName() + "]同窗"); interviewee.setTeamLeaderOpinion(new Random().nextBoolean()); if (interviewee.isTeamLeaderOpinion()) { System.out.println("[" + interviewee.getName() + "]同窗組長輪面試經過"); this.nextInterviewer.handleInterview(interviewee); } else { System.out.println("[" + interviewee.getName() + "]同窗組長輪面試不經過"); } } } /** * 部門經理 */ class DepartMentManager extends Interviewer { public DepartMentManager(String name) { super(name); } @Override public void handleInterview(Interviewee interviewee) { System.out.println("部門經理[" + this.name + "]面試[" + interviewee.getName() + "]同窗"); interviewee.setDepartMentManagerOpinion(new Random().nextBoolean()); if (interviewee.isDepartMentManagerOpinion()) { System.out.println("[" + interviewee.getName() + "]同窗部門經理輪面試經過"); this.nextInterviewer.handleInterview(interviewee); } else { System.out.println("[" + interviewee.getName() + "]同窗部門經理輪面試不經過"); } } } /** * HR */ class HR extends Interviewer { public HR(String name) { super(name); } @Override public void handleInterview(Interviewee interviewee) { System.out.println("HR[" + this.name + "]面試[" + interviewee.getName() + "]同窗"); interviewee.setHrOpinion(new Random().nextBoolean()); if (interviewee.isHrOpinion()) { System.out.println("[" + interviewee.getName() + "]同窗HR輪面試經過, 恭喜拿到 Offer"); } else { System.out.println("[" + interviewee.getName() + "]同窗HR輪面試不經過"); } } } 打印結果: 組長[老剛]面試[小明]同窗 [小明]同窗組長輪面試經過 部門經理[老孫]面試[小明]同窗 [小明]同窗部門經理輪面試經過 HR[老劉]面試[小明]同窗 [小明]同窗HR輪面試經過, 恭喜拿到 Offer
上面代碼打印結果是小明經過層層篩選,經過了面試,拿到了 Offer。下面的圖來展示此次面試的流程。this
講解一下代碼,Interviewee 是面試者,對於企業來講這個面試者來面試的過程會有 3 個關鍵標識,就是 3 位面試官對這位面試者的評價,只有都評價好才能經過面試拿到 Offer,因此 Interviewee 類有 3 位面試官的面試結果。Interviewer 是面時官,企業中面試官不是一個職位,而是一個工做,幫企業招到合適的人才,因此它是一個抽象類,有一個抽象方法就是去面試應聘者,具體面試過程又各面試官實現,而由於這個面試會有結果反饋,結果好的會進入下一輪面試,因此會有下一個面試官的對象引用,責任鏈模式也就在這裏體現。TeamLeader、DepartMentManager、HR 則爲公司的不一樣職位,而這些職位當公司須要招聘時,都須要去充當面試官,因此都繼承了 Interviewer。這整個過程就構成了責任鏈模式代碼示例,但願在金三銀四各位蠢蠢欲動的朋友們都能闖到最後一關拿下 HR 姐姐。
代碼:
Chain of Responsibility Pattern
責任鏈模式很好的把處理的邏輯封裝起來,在代碼中,咱們看到的只是組長面試,可是其實背後隱藏着部門經理和HR的面試。責任鏈是否是看起來很熟悉?在開發 Java Web 項目的時候是否是有用到過?Filter 過濾器裏面就是用責任鏈模式來實現的。上面代碼還用到了另外一個模式,不明確指出來了,考驗你們學習這些設計模式的效果,知道的同窗能夠留言說一下。
參考資料:《大話設計模式》、《設計模式之禪》
推薦閱讀:
但願文章對您有所幫助,設計模式系列會持續更新,感興趣的同窗能夠關注公衆號:LieBrother,第一時間獲取文章推送閱讀,也能夠一塊兒交流,交個朋友。