設(shè)計(jì)模式(十五)責(zé)任鏈設(shè)計(jì)模式

設(shè)計(jì)模式專欄

設(shè)計(jì)模式專欄

1.定義

使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求氛堕,從而避免了請(qǐng)求的發(fā)送者與接受者之間的耦合關(guān)系顾瞪,將這些對(duì)象生成一個(gè)鏈掷邦,并沿著這條鏈傳遞該對(duì)象汪诉,只到有對(duì)象處理這個(gè)請(qǐng)求為止,即:將一個(gè)請(qǐng)求從鏈?zhǔn)降氖锥税l(fā)出废恋,沿著鏈的路徑依次傳遞給每一個(gè)節(jié)點(diǎn)對(duì)象,直至有對(duì)象處理這個(gè)請(qǐng)求為止扒寄,將這樣的一種模式稱為責(zé)任鏈設(shè)計(jì)模式

2.結(jié)構(gòu)圖

image.png

3.使用場(chǎng)景

多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求鱼鼓,但具體由哪個(gè)對(duì)象處理,只有到運(yùn)行的時(shí)候動(dòng)態(tài)決定

4.抽象簡(jiǎn)單實(shí)現(xiàn)示例:

/**
 * 抽象處理著角色该编,聲明請(qǐng)求處理方法迄本,并在其中保留一個(gè)對(duì)下一個(gè)處理節(jié)點(diǎn)的對(duì)象的引用
 */
public abstract class Handler {

    /**
     * 下一個(gè)節(jié)點(diǎn)的處理者
     */
    protected Handler successor;

    /**
     * 處理請(qǐng)求方法
     * @param condition
     */
    public abstract void handleRequest(String condition);

}
/**
 * 第一個(gè)對(duì)象處理者
 */
public class Handler1 extends Handler {
    @Override
    public void handleRequest(String condition) {
        if (condition.equals("handler1Request")){
            System.out.println("Handler1 handler request");
            return;
        }else{
            successor.handleRequest(condition);
        }
    }
}
/**
 * 第二個(gè)對(duì)象處理者
 */
public class Handler2 extends Handler {
    @Override
    public void handleRequest(String condition) {
        if (condition.equals("handler2Request")){
            System.out.println("Handler2 handler request");
            return;
        }else{
            successor.handleRequest(condition);
        }
    }
}
public class Main {

    public static  void main(String args[]){
        //how to use
        Handler1 handler1=new Handler1();
        Handler2 handler2 =new Handler2();

        handler1.successor=handler2;
        handler2.successor=handler1;

        handler1.handleRequest("handler2Request");
    }
}
image.png

5.具體場(chǎng)景使用示例:

公司員工進(jìn)行報(bào)銷單子,假如組長(zhǎng)的報(bào)銷的金額是1000课竣,經(jīng)理報(bào)銷的金額是3000嘉赎,超過3000的則老板進(jìn)行報(bào)銷,模擬以上場(chǎng)景于樟,實(shí)現(xiàn)責(zé)任鏈?zhǔn)纠缦?

/**
 * 抽象領(lǐng)導(dǎo)
 */
public abstract class Leader {
    //上級(jí)領(lǐng)導(dǎo)
    Leader nextHandler;

    //報(bào)銷金額
    abstract int limit();

    //具體處理請(qǐng)求方法
    abstract void handler(int money);
    
    //是否處理請(qǐng)求判斷
    void handerRequest(int money) {
        if (money < limit()) {
            handler(money);
        } else {
            if (nextHandler != null)
                nextHandler.handerRequest(money);
        }
    }
}

/**
 * 老板
 */
public class BossHandler extends Leader {
    @Override
    int limit() {
        return Integer.MAX_VALUE;
    }

    @Override
    void handler(int money) {
        System.out.println("老板報(bào)銷了:" + money);
    }
}
/**
 * 經(jīng)理
 */
public class ManagerHandler extends Leader {
    @Override
    int limit() {
        return 3000;
    }

    @Override
    void handler(int money) {
        System.out.println("項(xiàng)目經(jīng)理報(bào)銷了:" + money);
    }
}

/**
 * 組長(zhǎng)
 */
public class GroupHandler extends Leader {
    @Override
    int limit() {
        return 1000;
    }

    @Override
    void handler(int money) {
        System.out.println("組長(zhǎng)報(bào)銷了:" + money);
    }
}
public class Me {

    public static void main(String args[]) {
        GroupHandler groupHandler = new GroupHandler();
        ManagerHandler managerHandler = new ManagerHandler();
        BossHandler bossHandler = new BossHandler();

        groupHandler.nextHandler = managerHandler;
        managerHandler.nextHandler = bossHandler;

        groupHandler.handerRequest(500);
        groupHandler.handerRequest(1900);
        groupHandler.handerRequest(8000);
    }
}
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末曹阔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子隔披,更是在濱河造成了極大的恐慌赃份,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異抓韩,居然都是意外死亡纠永,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門谒拴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尝江,“玉大人,你說我怎么就攤上這事英上√啃颍” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵苍日,是天一觀的道長(zhǎng)惭聂。 經(jīng)常有香客問我,道長(zhǎng)相恃,這世上最難降的妖魔是什么辜纲? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮拦耐,結(jié)果婚禮上耕腾,老公的妹妹穿的比我還像新娘。我一直安慰自己杀糯,他們只是感情好扫俺,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著固翰,像睡著了一般牵舵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上倦挂,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天畸颅,我揣著相機(jī)與錄音,去河邊找鬼方援。 笑死没炒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的犯戏。 我是一名探鬼主播送火,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼先匪!你這毒婦竟也來了种吸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤呀非,失蹤者是張志新(化名)和其女友劉穎坚俗,沒想到半個(gè)月后镜盯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猖败,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年速缆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恩闻。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艺糜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幢尚,到底是詐尸還是另有隱情破停,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布尉剩,位于F島的核電站真慢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏边涕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一褂微、第九天 我趴在偏房一處隱蔽的房頂上張望功蜓。 院中可真熱鬧,春花似錦宠蚂、人聲如沸式撼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽著隆。三九已至,卻和暖如春呀癣,著一層夾襖步出監(jiān)牢的瞬間美浦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工项栏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浦辨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓沼沈,卻偏偏與公主長(zhǎng)得像流酬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子列另,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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