LieBrother原文:
行為型模式:責(zé)任鏈模式
十一大行為型模式之四:責(zé)任鏈模式棋傍。
簡(jiǎn)介
姓名 :責(zé)任鏈模式
英文名 :Chain of Responsibility Pattern
價(jià)值觀 :責(zé)任歸我
個(gè)人介紹 :
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.
使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求祠墅,從而避免了請(qǐng)求的發(fā)送者和接受者之間的耦合關(guān)系评肆。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求陕赃,直到有對(duì)象處理它為止卵蛉。
(來(lái)自《設(shè)計(jì)模式之禪》)
你要的故事
快要金三銀四了,很多同學(xué)蠢蠢欲動(dòng)想要去外面看看世界么库,而大家有沒(méi)有提前了解各大企業(yè)的面試流程呢傻丝?這里我就給大家科普一下大多數(shù)互聯(lián)網(wǎng)企業(yè)的面試流程,正好責(zé)任鏈模式用得上诉儒。
在互聯(lián)網(wǎng)企業(yè)中葡缰,程序員這個(gè)崗位的招聘流程大同小異,而一般至少都會(huì)有 3 輪面試忱反,分別是 2 輪技術(shù)面和 1 輪 HR 面泛释。而這幾輪面試都是層層遞進(jìn)的,最開(kāi)始面試一般是組長(zhǎng)面試温算,通過(guò)之后就是部門(mén)領(lǐng)導(dǎo)面試怜校,再通過(guò)之后就是 HR 面試,HR 面試通過(guò)之后就可以成功拿到 Offer 了注竿。
故事從小明參加某公司的面試開(kāi)始茄茁,某公司的招聘流程就是上面說(shuō)的 3 輪面試。招聘流程的面試官分別是:第一面是組長(zhǎng)老剛巩割,第二面是部門(mén)經(jīng)理老孫胰丁,第三面也就是終面是 HR 老劉。為什么說(shuō)這個(gè)場(chǎng)景符合責(zé)任鏈模式呢喂分?首先不管是組長(zhǎng)還是部門(mén)經(jīng)理還是 HR,他們都作為面試官机蔗,面試官賦予他們的權(quán)利是去面試來(lái)公司面試的同學(xué)蒲祈,而面試的結(jié)果是可傳遞性的甘萧,也就是如果面試通過(guò),就會(huì)到下一輪面試梆掸,最終成為一條傳遞鏈扬卷。我們用代碼模擬這個(gè)過(guò)程。
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("老劉");
// 設(shè)置面試流程
teamLeader.setNextInterviewer(departMentManager);
departMentManager.setNextInterviewer(hr);
// 開(kāi)始面試
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);
}
/**
* 組長(zhǎng)
*/
class TeamLeader extends Interviewer {
public TeamLeader(String name) {
super(name);
}
@Override
public void handleInterview(Interviewee interviewee) {
System.out.println("組長(zhǎng)[" + this.name + "]面試[" + interviewee.getName() + "]同學(xué)");
interviewee.setTeamLeaderOpinion(new Random().nextBoolean());
if (interviewee.isTeamLeaderOpinion()) {
System.out.println("[" + interviewee.getName() + "]同學(xué)組長(zhǎng)輪面試通過(guò)");
this.nextInterviewer.handleInterview(interviewee);
} else {
System.out.println("[" + interviewee.getName() + "]同學(xué)組長(zhǎng)輪面試不通過(guò)");
}
}
}
/**
* 部門(mén)經(jīng)理
*/
class DepartMentManager extends Interviewer {
public DepartMentManager(String name) {
super(name);
}
@Override
public void handleInterview(Interviewee interviewee) {
System.out.println("部門(mén)經(jīng)理[" + this.name + "]面試[" + interviewee.getName() + "]同學(xué)");
interviewee.setDepartMentManagerOpinion(new Random().nextBoolean());
if (interviewee.isDepartMentManagerOpinion()) {
System.out.println("[" + interviewee.getName() + "]同學(xué)部門(mén)經(jīng)理輪面試通過(guò)");
this.nextInterviewer.handleInterview(interviewee);
} else {
System.out.println("[" + interviewee.getName() + "]同學(xué)部門(mén)經(jīng)理輪面試不通過(guò)");
}
}
}
/**
* 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() + "]同學(xué)");
interviewee.setHrOpinion(new Random().nextBoolean());
if (interviewee.isHrOpinion()) {
System.out.println("[" + interviewee.getName() + "]同學(xué)HR輪面試通過(guò), 恭喜拿到 Offer");
} else {
System.out.println("[" + interviewee.getName() + "]同學(xué)HR輪面試不通過(guò)");
}
}
}
打印結(jié)果:
組長(zhǎng)[老剛]面試[小明]同學(xué)
[小明]同學(xué)組長(zhǎng)輪面試通過(guò)
部門(mén)經(jīng)理[老孫]面試[小明]同學(xué)
[小明]同學(xué)部門(mén)經(jīng)理輪面試通過(guò)
HR[老劉]面試[小明]同學(xué)
[小明]同學(xué)HR輪面試通過(guò), 恭喜拿到 Offer
上面代碼打印結(jié)果是小明通過(guò)層層篩選酸钦,通過(guò)了面試怪得,拿到了 Offer。下面的圖來(lái)展現(xiàn)這次面試的流程卑硫。
講解一下代碼徒恋,Interviewee 是面試者,對(duì)于企業(yè)來(lái)說(shuō)這個(gè)面試者來(lái)面試的過(guò)程會(huì)有 3 個(gè)關(guān)鍵標(biāo)識(shí)欢伏,就是 3 位面試官對(duì)這位面試者的評(píng)價(jià)入挣,只有都評(píng)價(jià)好才能通過(guò)面試拿到 Offer,所以 Interviewee 類(lèi)有 3 位面試官的面試結(jié)果硝拧。Interviewer 是面時(shí)官径筏,企業(yè)中面試官不是一個(gè)職位,而是一個(gè)工作障陶,幫企業(yè)招到合適的人才滋恬,所以它是一個(gè)抽象類(lèi),有一個(gè)抽象方法就是去面試應(yīng)聘者抱究,具體面試過(guò)程又各面試官實(shí)現(xiàn)恢氯,而因?yàn)檫@個(gè)面試會(huì)有結(jié)果反饋,結(jié)果好的會(huì)進(jìn)入下一輪面試媳维,所以會(huì)有下一個(gè)面試官的對(duì)象引用酿雪,責(zé)任鏈模式也就在這里體現(xiàn)。TeamLeader侄刽、DepartMentManager指黎、HR 則為公司的不同職位,而這些職位當(dāng)公司需要招聘時(shí)州丹,都需要去充當(dāng)面試官醋安,所以都繼承了 Interviewer。這整個(gè)過(guò)程就構(gòu)成了責(zé)任鏈模式代碼示例墓毒,希望在金三銀四各位蠢蠢欲動(dòng)的朋友們都能闖到最后一關(guān)拿下 HR 姐姐吓揪。
代碼:
Chain of Responsibility Pattern
總結(jié)
責(zé)任鏈模式很好的把處理的邏輯封裝起來(lái),在代碼中所计,我們看到的只是組長(zhǎng)面試柠辞,但是其實(shí)背后隱藏著部門(mén)經(jīng)理和HR的面試。責(zé)任鏈?zhǔn)遣皇强雌饋?lái)很熟悉主胧?在開(kāi)發(fā) Java Web 項(xiàng)目的時(shí)候是不是有用到過(guò)叭首?Filter 過(guò)濾器里面就是用責(zé)任鏈模式來(lái)實(shí)現(xiàn)的习勤。上面代碼還用到了另一個(gè)模式,不明確指出來(lái)了焙格,考驗(yàn)大家學(xué)習(xí)這些設(shè)計(jì)模式的效果图毕,知道的同學(xué)可以留言說(shuō)一下。
參考資料:《大話設(shè)計(jì)模式》眷唉、《設(shè)計(jì)模式之禪》
推薦閱讀:
希望文章對(duì)您有所幫助予颤,設(shè)計(jì)模式系列會(huì)持續(xù)更新,感興趣的同學(xué)可以關(guān)注公眾號(hào):LieBrother冬阳,第一時(shí)間獲取文章推送閱讀蛤虐,也可以一起交流,交個(gè)朋友摩泪。