設(shè)計(jì)模式[17]-職責(zé)鏈模式-Chain of Responsibility Pattern

1.職責(zé)鏈模式簡(jiǎn)介

職責(zé)鏈(Chain of Responsibility)模式是是行為型(Behavioral)設(shè)計(jì)模式,是一種鏈?zhǔn)教幚碚?qǐng)求的設(shè)計(jì)模式于购,請(qǐng)求在鏈上傳遞妹懒,直到鏈上的有對(duì)象負(fù)責(zé)處理請(qǐng)求闹蒜。Servlet中Filter鏈、Spring MVC的Interceptor攔截器鏈揭芍,都是職責(zé)鏈的具體應(yīng)用胳搞。

職責(zé)鏈模式一共有二種角色:

(1) Handler(抽象處理者):它定義了處理請(qǐng)求的接口,還引用了下一個(gè)處理者称杨。

(2) ConcreteHandler(具體處理者):它是抽象處理者的子類肌毅,根據(jù)請(qǐng)求來(lái)判斷處理請(qǐng)求還是把請(qǐng)求傳遞給下一個(gè)具體處理者。

2. 職責(zé)鏈模式舉例

下面做一個(gè)經(jīng)費(fèi)申請(qǐng)的例子姑原,假設(shè)審批人共有三個(gè)悬而,分別是經(jīng)理、總監(jiān)锭汛、和總經(jīng)理笨奠;經(jīng)理審批500元以下的申請(qǐng),總監(jiān)審批1000元以下的申請(qǐng)唤殴,總經(jīng)理審批1000元以上的申請(qǐng)般婆。

序號(hào) 類名 角色 說明
1 Handler Handler 抽象處理者
2 Manager ConcreteHandler 具體處理者,經(jīng)理
3 Director ConcreteHandler 具體處理者朵逝,總監(jiān)
4 GeneralManager ConcreteHandler 具體處理者蔚袍,總經(jīng)理
5 ChainMain 客戶端 演示調(diào)用,組裝責(zé)任鏈
Chain of Responsibility.png

1. 抽象處理者

/**
 * 抽象處理者
 */
public abstract class Handler {

    // 下一個(gè)處理者
    private Handler nextHandler;

    // 抽象的處理請(qǐng)求的方法
    public abstract void handleRequest(int amount);

    // 獲取下一個(gè)處理者
    public Handler getNextHandler() {
        return nextHandler;
    }

    // 設(shè)置下一個(gè)處理者
    public void setNextHandler(Handler handler) {
        this.nextHandler = handler;
    }
}

2. 經(jīng)理

/**
 * 經(jīng)理廉侧,審批500元以內(nèi)的經(jīng)費(fèi)
 */
public class Manager extends Handler {

    @Override
    public void handleRequest(int amount) {
        if (amount < 500) {
            System.out.println("我是經(jīng)理页响,批準(zhǔn)了經(jīng)費(fèi)申請(qǐng),金額是:" + amount);
        } else {
            Handler next = getNextHandler();
            if (next != null) {
                next.handleRequest(amount);
            }
        }
    }
}

3. 總監(jiān)

/**
 * 總監(jiān)段誊,審批1000元以內(nèi)的經(jīng)費(fèi)
 */
public class Director extends Handler{

    @Override
    public void handleRequest(int amount) {
        if (amount < 1000) {
            System.out.println("我是總監(jiān)闰蚕,批準(zhǔn)了經(jīng)費(fèi)申請(qǐng),金額是:" + amount);
        } else {
            Handler next = getNextHandler();
            if (next != null) {
                next.handleRequest(amount);
            }
        }
    }
}

4. 總經(jīng)理

/**
 * 總經(jīng)理连舍,審批大于1000元的經(jīng)費(fèi)没陡,如果超過5000元,就不批準(zhǔn)索赏。
 */
public class GeneralManager extends Handler {

    @Override
    public void handleRequest(int amount) {
        if (amount >= 1000 && amount < 5000) {
            System.out.println("我是總經(jīng)理盼玄,批準(zhǔn)了經(jīng)費(fèi)申請(qǐng),金額是:" + amount);
        } else if (amount >= 5000) {
            System.out.println("我是總經(jīng)理潜腻,駁回了經(jīng)費(fèi)申請(qǐng)埃儿,金額是:" + amount);
        } else {
            Handler next = getNextHandler();
            if (next != null) {
                next.handleRequest(amount);
            }
        }
    }
}

5. 演示類

/**
 * 客戶端演示
 */
public class ChainMain {

    public static void main(String[] args) {
        // 組裝責(zé)任鏈
        Handler manager = new Manager();
        Handler director = new Director();
        Handler gm = new GeneralManager();
        manager.setNextHandler(director);
        director.setNextHandler(gm);
        // Case 1
        int fee = 823;
        System.out.println("提交吃飯經(jīng)費(fèi)申請(qǐng),金額:" + fee);
        manager.handleRequest(fee);
        System.out.println("-----------------------");
        // Case 2
        fee = 8230;
        System.out.println("提交團(tuán)隊(duì)建設(shè)經(jīng)費(fèi)申請(qǐng)融涣,金額:" + fee);
        manager.handleRequest(fee);
    }
}

結(jié)果輸出

提交吃飯經(jīng)費(fèi)申請(qǐng)童番,金額:823
我是總監(jiān),批準(zhǔn)了經(jīng)費(fèi)申請(qǐng)威鹿,金額是:823
-----------------------
提交團(tuán)隊(duì)建設(shè)經(jīng)費(fèi)申請(qǐng)剃斧,金額:8230
我是總經(jīng)理,駁回了經(jīng)費(fèi)申請(qǐng)忽你,金額是:8230

3. 總結(jié)

職責(zé)鏈分為純的和不純的兩種幼东。純的職責(zé)鏈中只有一個(gè)處理者會(huì)承擔(dān)起處理請(qǐng)求的責(zé)任,其余的處理者都只是轉(zhuǎn)發(fā)科雳;不純的職責(zé)鏈中根蟹,允許0到n個(gè)具體處理者處理請(qǐng)求。

職責(zé)鏈模式的優(yōu)點(diǎn)在于炸渡,請(qǐng)求方不需要知道是哪個(gè)Handler處理了請(qǐng)求娜亿,而且鏈中的Handler也不需要知道鏈的結(jié)構(gòu),帶來(lái)了系統(tǒng)的靈活性蚌堵。

職責(zé)鏈的缺點(diǎn)在于买决,由于沒有明確的Handler處理,可能導(dǎo)致請(qǐng)求無(wú)人處理吼畏;如果鏈很長(zhǎng)督赤,對(duì)于調(diào)試來(lái)說是不利的;如果建鏈不當(dāng)泻蚊,可能會(huì)出現(xiàn)死循環(huán)躲舌。

(完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市性雄,隨后出現(xiàn)的幾起案子没卸,更是在濱河造成了極大的恐慌羹奉,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件约计,死亡現(xiàn)場(chǎng)離奇詭異诀拭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)煤蚌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門耕挨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人尉桩,你說我怎么就攤上這事筒占。” “怎么了蜘犁?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵翰苫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我沽瘦,道長(zhǎng)革骨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任析恋,我火速辦了婚禮良哲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘助隧。我一直安慰自己筑凫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布并村。 她就那樣靜靜地躺著巍实,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哩牍。 梳的紋絲不亂的頭發(fā)上棚潦,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音膝昆,去河邊找鬼丸边。 笑死,一個(gè)胖子當(dāng)著我的面吹牛荚孵,可吹牛的內(nèi)容都是我干的妹窖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼收叶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼骄呼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蜓萄,失蹤者是張志新(化名)和其女友劉穎隅茎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫉沽,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡患膛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耻蛇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胞此,死狀恐怖臣咖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漱牵,我是刑警寧澤夺蛇,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站酣胀,受9級(jí)特大地震影響刁赦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闻镶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一甚脉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铆农,春花似錦牺氨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至岭皂,卻和暖如春郊霎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爷绘。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工书劝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揉阎。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓庄撮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親毙籽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洞斯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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