責(zé)任鏈模式

1. 基本概念

責(zé)任鏈模式(Chain of Responsibility Pattern)為請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈谅摄。實(shí)現(xiàn)了發(fā)送者和接收者之間的解耦聪廉,屬于行為型模式萧诫。

2 主要思想

各司其職扮饶,職責(zé)鏈上的處理者負(fù)責(zé)處理請(qǐng)求夺巩,客戶端只需要將請(qǐng)求發(fā)送到職責(zé)鏈上贞让,不用關(guān)心接下來的請(qǐng)求傳遞及請(qǐng)求處理。
主要的實(shí)現(xiàn)方式是攔截類都實(shí)現(xiàn)統(tǒng)一的接口柳譬,方便統(tǒng)一傳遞喳张。
在處理類Handler中聚合自己,在過濾接口美澳,例如HandlerRequest 中判斷是否應(yīng)該由自己處理销部,如果不是,繼續(xù)傳遞給上層處理制跟。

3. 代碼實(shí)現(xiàn)

需求:職員Staff 想要請(qǐng)假8天舅桩,逐級(jí)向上審批,經(jīng)理可以審批3天內(nèi)的雨膨,總監(jiān)可以審批7天內(nèi)的擂涛,老板可以審批7天以上的。

 public static void main(String[] args) {
        String msg = "家里有事聊记,請(qǐng)假8天撒妈,望批準(zhǔn)!";
        Staff staff = new Staff();
        Manager manager = new Manager();
        Director director = new Director();
        Boss boss = new Boss();

        staff.setProcessor(manager);
        manager.setProcessor(director);
        director.setProcessor(boss);

        staff.handler(msg);
    }

}

abstract class Handler {
    Handler processor;
    abstract void handler(String msg);
    abstract void setProcessor(Handler processor);
    abstract Handler getProcessor();
}

class Staff extends Handler {
    private Handler processor;

    @Override
    void handler(String msg) {
        System.out.println("小弟不能自己做主,只能向上申請(qǐng)!");
        this.processor.handler(msg);
    }

    @Override
    void setProcessor(Handler processor) {
        this.processor = processor;
    }

    @Override
    Handler getProcessor() {
        return processor;
    }
}

class Manager extends Handler {
    private Handler processor;

    @Override
    void handler(String msg) {
        System.out.println("我只能審批3天內(nèi)的排监,超出3天的范圍踩身,需Director審批!");
        this.processor.handler(msg);
    }

    @Override
    void setProcessor(Handler processor) {
        this.processor = processor;
    }

    @Override
    Handler getProcessor() {
        return processor;
    }
}

class Director extends Handler {
    private Handler processor;

    @Override
    void handler(String msg) {
        System.out.println("我只能審批7天內(nèi)的,超出7天的范圍社露,挟阻,需Boss審批!");
        this.processor.handler(msg);
    }

    @Override
    void setProcessor(Handler processor) {
        this.processor = processor;
    }

    @Override
    Handler getProcessor() {
        return processor;
    }
}

class Boss extends Handler {
    private Handler processor;

    @Override
    void handler(String msg) {
        System.out.println("批準(zhǔn)!");
    }

    @Override
    void setProcessor(Handler processor) {
        this.processor = processor;
    }

    @Override
    Handler getProcessor() {
        return processor;
    }

運(yùn)行結(jié)果

小弟不能自己做主,只能向上申請(qǐng)!
我只能審批3天內(nèi)的,超出3天的范圍附鸽,需Director審批!
我只能審批7天內(nèi)的脱拼,超出7天的范圍,坷备,需Boss審批!
批準(zhǔn)!

4. 優(yōu)劣之分

優(yōu)點(diǎn):
1熄浓、降低耦合度。它將請(qǐng)求的發(fā)送者和接收者解耦省撑。
2赌蔑、簡(jiǎn)化了對(duì)象。使得對(duì)象不需要知道鏈的結(jié)構(gòu)竟秫。
3娃惯、增強(qiáng)給對(duì)象指派職責(zé)的靈活性。通過改變鏈內(nèi)的成員或者調(diào)動(dòng)它們的次序肥败,允許動(dòng)態(tài)地新增或者刪除責(zé)任趾浅。
4、增加新的請(qǐng)求處理類很方便馒稍。

缺點(diǎn):
1皿哨、不能保證請(qǐng)求一定被接收。
2纽谒、系統(tǒng)性能將受到一定影響证膨,而且在進(jìn)行代碼調(diào)試時(shí)不太方便,可能會(huì)造成循環(huán)調(diào)用鼓黔。
3椎例、可能不容易觀察運(yùn)行時(shí)的特征,有礙于除錯(cuò)请祖。

使用場(chǎng)景:
1订歪、有多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求,具體哪個(gè)對(duì)象處理該請(qǐng)求由運(yùn)行時(shí)刻自動(dòng)確定肆捕。
2刷晋、在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求慎陵。
3眼虱、可動(dòng)態(tài)指定一組對(duì)象處理請(qǐng)求。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末席纽,一起剝皮案震驚了整個(gè)濱河市捏悬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌润梯,老刑警劉巖过牙,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甥厦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡寇钉,警方通過查閱死者的電腦和手機(jī)刀疙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扫倡,“玉大人谦秧,你說我怎么就攤上這事∧炖#” “怎么了疚鲤?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)缘挑。 經(jīng)常有香客問我集歇,道長(zhǎng),這世上最難降的妖魔是什么卖哎? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮删性,結(jié)果婚禮上亏娜,老公的妹妹穿的比我還像新娘。我一直安慰自己蹬挺,他們只是感情好维贺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巴帮,像睡著了一般溯泣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上榕茧,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天垃沦,我揣著相機(jī)與錄音,去河邊找鬼用押。 笑死肢簿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜻拨。 我是一名探鬼主播池充,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼缎讼!你這毒婦竟也來了收夸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤血崭,失蹤者是張志新(化名)和其女友劉穎卧惜,沒想到半個(gè)月后厘灼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡序苏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年手幢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忱详。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡围来,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匈睁,到底是詐尸還是另有隱情监透,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布航唆,位于F島的核電站胀蛮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏糯钙。R本人自食惡果不足惜粪狼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望任岸。 院中可真熱鬧再榄,春花似錦、人聲如沸享潜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剑按。三九已至疾就,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艺蝴,已是汗流浹背猬腰。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猜敢,地道東北人漆诽。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锣枝,于是被迫代替她去往敵國(guó)和親厢拭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344