行為型模式:責(zé)任鏈模式

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ì)模式之禪》

推薦閱讀:

公眾號(hào)之設(shè)計(jì)模式系列文章

希望文章對(duì)您有所幫助予颤,設(shè)計(jì)模式系列會(huì)持續(xù)更新,感興趣的同學(xué)可以關(guān)注公眾號(hào):LieBrother冬阳,第一時(shí)間獲取文章推送閱讀蛤虐,也可以一起交流,交個(gè)朋友摩泪。

公眾號(hào)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笆焰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子见坑,更是在濱河造成了極大的恐慌嚷掠,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荞驴,死亡現(xiàn)場(chǎng)離奇詭異不皆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)熊楼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)霹娄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鲫骗,你說(shuō)我怎么就攤上這事犬耻。” “怎么了执泰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵枕磁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我术吝,道長(zhǎng)计济,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任排苍,我火速辦了婚禮沦寂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淘衙。我一直安慰自己传藏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著毯侦,像睡著了一般西壮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叫惊,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音做修,去河邊找鬼霍狰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饰及,可吹牛的內(nèi)容都是我干的蔗坯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼燎含,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宾濒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起屏箍,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绘梦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后赴魁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體卸奉,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年颖御,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榄棵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潘拱,死狀恐怖疹鳄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芦岂,我是刑警寧澤瘪弓,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站盔腔,受9級(jí)特大地震影響杠茬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弛随,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一瓢喉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舀透,春花似錦栓票、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)佛猛。三九已至,卻和暖如春坠狡,著一層夾襖步出監(jiān)牢的瞬間继找,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工逃沿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婴渡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓凯亮,卻偏偏與公主長(zhǎng)得像边臼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子假消,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • “遠(yuǎn)距離,只會(huì)把我們的差距浮上臺(tái)面而已媒峡。想法上的差距瘟栖,觀念上的差距。現(xiàn)實(shí)會(huì)讓人長(zhǎng)大的谅阿。是的半哟,過(guò)程是非常的難受,但是...
    李毛毛TerryLeee閱讀 373評(píng)論 1 1
  • 今天签餐,和男朋友大吵了一架寓涨,原因其實(shí)只是雞毛蒜皮,但是他的最后一句話讓我有了深思氯檐,他說(shuō)戒良,他覺(jué)得我就是一個(gè)...
    我開(kāi)心_9d65閱讀 296評(píng)論 0 1
  • 第一天跑1000米,第二天4000米冠摄,第三天6000米糯崎,這樣的事情,我一步一步做到了河泳!
    思思培閱讀 213評(píng)論 0 0
  • 早上天氣不錯(cuò),溫度也比較低沃呢。做了一套樊登推薦的按摩操后出來(lái)晨跑。緩緩的跑了六百多米,有些累拆挥。停下來(lái)拉伸一下便回去了薄霜。
    AndySong_1ee8閱讀 205評(píng)論 0 0
  • 跟著蔡叔讀了《意志力》這本書(shū),最大的收獲就是得"清楚自己的意志力極限"。 ?大部分人都有自己偉大的目標(biāo)都有心底為之...
    盛云閱讀 407評(píng)論 3 5