Java 設(shè)計(jì)模式 -- 職責(zé)鏈模式

下面距芬,將通過一個(gè)例子,對(duì)職責(zé)鏈模式進(jìn)行介紹循帐。

問題:設(shè)想框仔,你有一個(gè)呼叫中心,員工分成三個(gè)層級(jí)拄养,接線員离斩,主管和經(jīng)理”衲洌客戶來(lái)電時(shí)會(huì)先分配給接線員跛梗,若接線員處理不了,就必須將來(lái)電往上轉(zhuǎn)給主管棋弥,若主管無(wú)法處理核偿,將來(lái)電往上轉(zhuǎn)給經(jīng)理。請(qǐng)?jiān)O(shè)計(jì)這個(gè)問題的類和數(shù)據(jù)結(jié)構(gòu)(為了方便顽染,將呼叫者的問題分等級(jí)漾岳,分別為 S 級(jí)轰绵,由接線員處理,SS 級(jí)尼荆,由主管處理左腔,SSS級(jí),由經(jīng)理處理)耀找。


首先翔悠,分析一下這個(gè)問題业崖,對(duì)于一次電話呼叫野芒,肯定存在 呼叫人和被呼叫人,所以我們可能需要設(shè)計(jì)一個(gè) Call 類來(lái)表示一個(gè)電話呼叫双炕,一個(gè) Caller 類用于封裝呼叫人的屬性狞悲,Employee 類用于表示接聽人,因?yàn)閱T工分三種妇斤,所以我們需要將 Employee 定義為一個(gè)抽象類摇锋,用于封裝員工的共同屬性。既然各個(gè)類模型已經(jīng)想好了站超,那么就要想想如何設(shè)計(jì)方法呢荸恕?也就是如何實(shí)現(xiàn)電話的傳遞呢?想想 Java 中是如何模仿指針效果的死相?下面來(lái)看看實(shí)現(xiàn)

public class Caller {

    private String mName;
    private String mRank;

    public Caller(String rank) {
        this.mRank = rank;
    }

    public String getName() {
        return mName;
    }

    public void setName(String name) {
        this.mName = name;
    }

    public String getRank() {
        return mRank;
    }

    public void setRank(String rank) {
        mRank = rank;
    }

    public void disconnect() {
        System.out.println("Caller : disconnect");
    }

}

以上為 Caller 方法融求,只有一個(gè)帶問題等級(jí)參數(shù)的構(gòu)造函數(shù),用于表示呼叫者必須首先聲明自己?jiǎn)栴}的等級(jí)算撮。還有一個(gè) disconnect() 方法生宛,當(dāng)呼叫者問題被處理完畢后調(diào)用,表示掛掉電話肮柜。

public abstract class Employee {

    protected Employee mBoss;

    public abstract void setBoss(Employee boss);

    public abstract void handleCall(Call call);

}

以上是一個(gè)抽象類陷舅,定義了一個(gè)屬性和兩個(gè)方法, setBoss() 用于設(shè)置當(dāng)前員工的頂頭上司审洞,handleCall() 方法在員工接聽電話時(shí)調(diào)用莱睁。下面來(lái)看看 接線員類的實(shí)現(xiàn)

public class Respondent extends Employee {

    @Override
    public void handleCall(Call call) {
        if (call.getCaller().getRank().equals("S")) {
            System.out.println("Respondent : handle this call");
            call.getCaller().disconnect();
        } else {
            mBoss.handleCall(call);
        }
    }

    @Override
    public void setBoss(Employee boss) {
        mBoss = boss;
    }

}

以上實(shí)現(xiàn)表明,setBoss() 方法必須在 handleCall() 方法之前調(diào)用芒澜,否則會(huì)報(bào)空指針錯(cuò)誤缩赛,因?yàn)樵?handleCall() 方法邏輯中,我們?cè)O(shè)置了撰糠,如果該員工能處理指定信息酥馍,則進(jìn)行處理,處理完之后呼叫者掛斷電話阅酪。如果不能處理旨袒,就將該呼叫傳遞給自己的頂頭上司汁针,交給他去處理。需要注意的是對(duì)于 Manager 類的實(shí)現(xiàn)砚尽,由于它已經(jīng)沒有上司施无,所以在handleCall()方法中做特殊處理,如下所示

@Override
    public void handleCall(Call call) {
        if (call.getCaller().getRank().equals("SSS")) {
            System.out.println("Manager :  handle this call");
            call.getCaller().disconnect();
        } else {
            System.out.println("We can not handle this call");
        }
    }

這里如果經(jīng)理也處理不了該通話必孤,只能打印不能處理該問題猾骡,不能再往上傳遞,否則會(huì)報(bào)空指針錯(cuò)誤敷搪。

下面來(lái)看看 Call 類是如何實(shí)現(xiàn)的

public class Call {

    private Caller mCaller;
    private Employee mEmployee;

    public Call(Caller caller) {
        this.mCaller = caller;
    }

    public Caller getCaller() {
        return mCaller;
    }

    public void handle() {
        mEmployee.handleCall(this);
    }

    public void setRespondent(Employee respondent) {
        mEmployee = respondent;
    }

}

在這里兴想,我們有一個(gè) setRespondent() 方法,這里設(shè)置的員工是接線員赡勘,因?yàn)橹挥羞@樣才可以確保如果該通話無(wú)法被處理向上傳遞嫂便。看到這里闸与,感覺這種模式就像踢皮球一樣毙替,你踢給我,我踢給你践樱,當(dāng)然也可以這么形容厂画,這種模式的實(shí)現(xiàn)思想和指針類似。

其實(shí)拷邢,我們已經(jīng)在很多地方見到過這種模式袱院,比如說 Java 的異常機(jī)制,如果一個(gè)地方拋出了異常解孙,會(huì)首先尋找距離最近的 catch 語(yǔ)句坑填,如果可以處理,就處理弛姜,不可以處理脐瑰,就再往上拋,直到可以被處理為止廷臼。

再比如說 Android 當(dāng)中的觸摸事件苍在,也是從容器中一級(jí)一級(jí)向下傳,直到傳到最底層的 View 視圖荠商,當(dāng)然傳到其中的任何一個(gè)容器的時(shí)候寂恬,都可以截?cái)噙@種傳遞。

我所理解的職責(zé)鏈模式就是如此莱没,如果有什么錯(cuò)誤的地方初肉,希望予以指正,互相學(xué)習(xí)饰躲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牙咏,一起剝皮案震驚了整個(gè)濱河市臼隔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妄壶,老刑警劉巖摔握,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異丁寄,居然都是意外死亡氨淌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門伊磺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盛正,“玉大人,你說我怎么就攤上這事奢浑÷瑁” “怎么了腋腮?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵雀彼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我即寡,道長(zhǎng)徊哑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任聪富,我火速辦了婚禮莺丑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘墩蔓。我一直安慰自己梢莽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布奸披。 她就那樣靜靜地躺著昏名,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阵面。 梳的紋絲不亂的頭發(fā)上轻局,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音样刷,去河邊找鬼仑扑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛置鼻,可吹牛的內(nèi)容都是我干的镇饮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼箕母,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼储藐!你這毒婦竟也來(lái)了梅肤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤邑茄,失蹤者是張志新(化名)和其女友劉穎姨蝴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肺缕,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡左医,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了同木。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浮梢。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖彤路,靈堂內(nèi)的尸體忽然破棺而出秕硝,到底是詐尸還是另有隱情,我是刑警寧澤洲尊,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布远豺,位于F島的核電站,受9級(jí)特大地震影響坞嘀,放射性物質(zhì)發(fā)生泄漏躯护。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一丽涩、第九天 我趴在偏房一處隱蔽的房頂上張望棺滞。 院中可真熱鬧,春花似錦矢渊、人聲如沸继准。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)移必。三九已至,卻和暖如春昂灵,著一層夾襖步出監(jiān)牢的瞬間避凝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工眨补, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留管削,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓撑螺,卻偏偏與公主長(zhǎng)得像含思,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法含潘,類相關(guān)的語(yǔ)法饲做,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法遏弱,異常的語(yǔ)法盆均,線程的語(yǔ)...
    子非魚_t_閱讀 31,639評(píng)論 18 399
  • 每日目標(biāo)今日完成: 早課聽書學(xué)習(xí),讀書筆記漱逸,英語(yǔ)口語(yǔ)練習(xí)泪姨,普通話聲音復(fù)習(xí)訓(xùn)練,演講練習(xí)饰抒,作品創(chuàng)作肮砾,教學(xué)(下午)。 ...
    微風(fēng)淡月88鄭亞兒閱讀 160評(píng)論 0 0
  • 我在雨中看你袋坑, 不遠(yuǎn)不近仗处, 如葉片低眉的水滴, 觸手可及又迅速溜去枣宫, 掉入一團(tuán)朦朧的霧氣婆誓, 打濕眼眶縈繞不去, 我...
    甜橙可宜閱讀 263評(píng)論 4 3
  • 真不知用什么語(yǔ)言來(lái)表達(dá)黃河的雄偉壯觀镶柱,只站在川上感嘆旷档,黃河之水天上來(lái) 奔流到海不復(fù)回……
    pan123456閱讀 477評(píng)論 0 0