責(zé)任鏈模式

  • 定義:

    責(zé)任鏈模式面向?qū)ο蟪淌皆O(shè)計(jì)里是一種軟件設(shè)計(jì)模式璃吧,它包含了一些命令對象和一系列的處理對象蚓炬。每一個(gè)處理對象決定它能處理哪些命令對象泼菌,它也知道如何將它不能處理的命令對象傳遞給該鏈中的下一個(gè)處理對象闲询。該模式還描述了往該處理鏈的末尾添加新的處理對象的方法。 ---維基百科

  • 開閉原則:對于擴(kuò)展開放,即有新需求過來時(shí)可以擴(kuò)展模塊;對于修改關(guān)閉,即擴(kuò)展模塊行為時(shí)不必修改源代碼.

  • 我理解來說就是在一次事件請求中有一個(gè)請求發(fā)送方和多個(gè)請求接收方,發(fā)送方不需要知道自己的請求到底會被誰接收,他只需要把請求發(fā)給第一個(gè)接收方,接下來就由第一個(gè)接收方抉擇自己能處理的話就自己處理,自己不能處理就返回下一個(gè)接收方接收的結(jié)果,從而降低了發(fā)送方和接收方的耦合程度,但是也有一些要求:比如每個(gè)接收方肯定都要有處理請求的方法,除了最后一個(gè)接收方,其他接收方必須存儲下個(gè)接收方的指針.

  • 先思考一下下面這個(gè)場景,無論在公司或是學(xué)校,肯定都會有審批什么東西或者事情的經(jīng)歷,拿審批請假來說,首先第一步是員工寫好郵件,說明自己的請假原因及時(shí)間,寫好之后發(fā)給小組主管,主管收到郵件之后有兩種處理方式:
    1.請假時(shí)間比較短,自己這邊就可以批了,此時(shí)返回審批結(jié)果就結(jié)束了;
    2.請假時(shí)間有點(diǎn)長,主管無法決定能不能批
    所以這時(shí)小組主管會發(fā)送審批郵件給所在部門的領(lǐng)導(dǎo),領(lǐng)導(dǎo)也有同樣的兩種處理方式,會按照時(shí)間長短來決定自己能不能批,一直到公司的上層領(lǐng)導(dǎo)來做最后的決策.

  • 這一套流程其實(shí)就是責(zé)任鏈模式的體現(xiàn),展現(xiàn)到代碼層面上

    首先有一個(gè)請求發(fā)送方:

    class Client{
        String name;
        int days;
        public Client(String name,int days){
            this.days = days;
            this.name = name;
        }
        public boolean sendRequest(Handler handler){
            System.out.println(name+"請求請假"+days+"天");
            return handler.handlerRequest(days);
        }
    }
    

其次有一個(gè)抽象的請求接收方來設(shè)置幾個(gè)默認(rèn)方法:

abstract class Handler{
    Handler nextHandler = null;
    int days = 0;
    public Handler(int days){
        this.days = days;
    }
    public boolean handlerRequest(int days){
        if (days <= this.days){
            System.out.println(name()+"同意請假");
            return true;
        }else {
            if (nextHandler == null){
                System.out.println("請假時(shí)間過長,所有人無法審批");
                return false;
            }else {
                System.out.println(name()+"無法處理,傳遞給上一級");
                return nextHandler.handlerRequest(days);
            }

        }
    }
    public void setNextHandler(Handler handler){
        nextHandler = handler;
    }
    public String name(){
        return this.getClass().getSimpleName();
    }
}

然后有幾個(gè)具體的請求接收方繼承抽象類:

class Handler1 extends Handler{
    public Handler1(int days) {
        super(days);
    }
}
class Handler2 extends Handler{
    public Handler2(int days) {
        super(days);
    }
}
class Handler3 extends Handler{

    public Handler3(int days) {
        super(days);
    }
}

接下來我們測試一下,設(shè)置handler1是第一個(gè)接收方:

public static void main(String[] args) {
  Handler1 handler1 = new Handler1(10);
  Handler2 handler2 = new Handler2(30);
  handler1.setNextHandler(handler2);
  Handler3 handler3 = new Handler3(100);
  handler2.setNextHandler(handler3);
  Client client1 = new Client("請求者1",10);
  client1.sendRequest(handler1);
  Client client2 = new Client("請求者2",20);
  client2.sendRequest(handler1);
  Client client3 = new Client("請求者3",50);
  client3.sendRequest(handler1);
  Client client4 = new Client("請求者4",120);
  client4.sendRequest(handler1);
}
結(jié)果:
結(jié)果
  • 接下來談一下這個(gè)模式的優(yōu)點(diǎn)及缺點(diǎn)

    優(yōu)點(diǎn):降低了兩方的耦合程度,使得如果有新的接收方加入或者之前的接收方退出對于發(fā)送方來說并不受到干擾,代碼滿足開閉原則

    缺點(diǎn)也比較明顯,因?yàn)榘l(fā)送方在發(fā)出請求之后,請求需要傳遞到能處理它的接收方才會返回結(jié)果,所以導(dǎo)致時(shí)間較長,性能較低

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末授嘀,一起剝皮案震驚了整個(gè)濱河市赴穗,隨后出現(xiàn)的幾起案子炕吸,更是在濱河造成了極大的恐慌姿染,老刑警劉巖背亥,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悬赏,居然都是意外死亡狡汉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門闽颇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盾戴,“玉大人,你說我怎么就攤上這事兵多〖夥龋” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵剩膘,是天一觀的道長衅斩。 經(jīng)常有香客問我,道長援雇,這世上最難降的妖魔是什么矛渴? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任椎扬,我火速辦了婚禮惫搏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚕涤。我一直安慰自己筐赔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布揖铜。 她就那樣靜靜地躺著茴丰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贿肩,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天峦椰,我揣著相機(jī)與錄音,去河邊找鬼汰规。 笑死汤功,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溜哮。 我是一名探鬼主播滔金,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茂嗓!你這毒婦竟也來了餐茵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤述吸,失蹤者是張志新(化名)和其女友劉穎忿族,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝌矛,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肠阱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朴读。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屹徘。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖衅金,靈堂內(nèi)的尸體忽然破棺而出噪伊,到底是詐尸還是另有隱情,我是刑警寧澤氮唯,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布鉴吹,位于F島的核電站,受9級特大地震影響惩琉,放射性物質(zhì)發(fā)生泄漏豆励。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一瞒渠、第九天 我趴在偏房一處隱蔽的房頂上張望良蒸。 院中可真熱鬧,春花似錦伍玖、人聲如沸嫩痰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽串纺。三九已至丽旅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纺棺,已是汗流浹背榄笙。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祷蝌,地道東北人办斑。 一個(gè)月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像杆逗,于是被迫代替她去往敵國和親乡翅。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

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

  • 1 場景問題# 1.1 申請聚餐費(fèi)用## 來考慮這樣一個(gè)功能:申請聚餐費(fèi)用的管理罪郊。 很多公司都有這樣的福利蠕蚜,就是項(xiàng)...
    七寸知架構(gòu)閱讀 3,125評論 3 58
  • 源碼地址 介紹 它是一種行為型設(shè)計(jì)模式之一。它的每一個(gè)節(jié)點(diǎn)都可以看作是一個(gè)對象悔橄,每一個(gè)對象擁有不同的處理邏輯靶累,將一...
    yangMr閱讀 726評論 0 3
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是責(zé)任鏈模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 純與不純的責(zé)任鏈模式 優(yōu)點(diǎn)和缺點(diǎn) ...
    w1992wishes閱讀 1,255評論 4 14
  • 01 情緒可以隨時(shí)隨地產(chǎn)生,人的喜怒哀樂就是情緒的總體概括癣疟,人們其實(shí)都不喜歡怒哀而喜歡喜樂挣柬,可是無數(shù)的人卻大部分時(shí)...
    夜語山林閱讀 521評論 1 5
  • 室友小Q是個(gè)很優(yōu)秀的妹子,她是主席團(tuán)秘書部很得力的一名干事睛挚。一天除了上課邪蛔、吃飯和睡覺,其他時(shí)間幾乎都呆在系部的辦公...
    他有時(shí)光機(jī)閱讀 436評論 0 3