面向?qū)ο缶幊淘O(shè)計(jì)模式------職責(zé)鏈模式

??職責(zé)鏈模式(Chain of Responsibility):使多個對象都有機(jī)會處理請求班利,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對象連成一條鏈眯娱,并沿著這條鏈傳遞該請求铣墨,直到有一個對象處理它為止。

1嗽上、Handler類次舌,定義一個處理請示的接口。

/**
 * @Description: 定義一個處理請求的接口
 * @author: zxt
 * @time: 2019年5月13日 下午9:31:56
 */
public abstract class Handler {
    
    // 設(shè)置繼任者
    protected Handler successor;
    
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
    
    // 處理請求的抽象方法
    public abstract void HandleRequest(int request);
}

2兽愤、ConcreteHandler類彼念,具體處理者類,處理它所負(fù)責(zé)的請求浅萧,可訪問它的后繼者逐沙,如果可處理該請求,就處理之洼畅,否則就將該請求轉(zhuǎn)發(fā)給它的后繼者吩案。

/**
 * @Description: 當(dāng)請求數(shù)在0到10之間則有權(quán)處理,否則轉(zhuǎn)到下一位
 * @author: zxt
 * @time: 2019年5月13日 下午9:49:34
 */
public class ConcreteHandler1 extends Handler {

    @Override
    public void HandleRequest(int request) {
        if (request >= 0 && request < 10) {
            System.out.println(this.getClass().getName() + " 處理請求 " + request);
            
        } else if (successor != null) {
            // 轉(zhuǎn)移到下一位
            successor.HandleRequest(request);
        }
    }
}
/**
 * @Description: 當(dāng)請求數(shù)在10到20之間則有權(quán)處理帝簇,否則轉(zhuǎn)到下一位
 * @author: zxt
 * @time: 2019年5月13日 下午9:49:34
 */
public class ConcreteHandler2 extends Handler {

    @Override
    public void HandleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println(this.getClass().getName() + " 處理請求 " + request);
            
        } else if (successor != null) {
            // 轉(zhuǎn)移到下一位
            successor.HandleRequest(request);
        }
    }
}
/**
 * @Description: 當(dāng)請求數(shù)在20到30之間則有權(quán)處理徘郭,否則轉(zhuǎn)到下一位
 * @author: zxt
 * @time: 2019年5月13日 下午9:49:34
 */
public class ConcreteHandler3 extends Handler {

    @Override
    public void HandleRequest(int request) {
        if (request >= 20 && request < 30) {
            System.out.println(this.getClass().getName() + " 處理請求 " + request);
            
        } else if (successor != null) {
            // 轉(zhuǎn)移到下一位
            successor.HandleRequest(request);
        }
    }
}
/**
 * @Description: 末端處理器
 * @author: zxt
 * @time: 2019年5月13日 下午9:49:34
 */
public class ConcreteHandler extends Handler {

    @Override
    public void HandleRequest(int request) {
        System.out.println(this.getClass().getName() + " 處理請求 " + request);
    }
}

3、測試

public class Test {

    public static void main(String[] args) {
        // 設(shè)置職責(zé)鏈的上下家
        Handler h1 = new ConcreteHandler1();
        Handler h2 = new ConcreteHandler2();
        Handler h3 = new ConcreteHandler3();
        Handler h = new ConcreteHandler();
        h1.setSuccessor(h2);
        h2.setSuccessor(h3);
        h3.setSuccessor(h);
        
        int[] requests = {2, 5, 14, 22, 18, 3, 27, 20, 40};
        
        // 循環(huán)給最小處理者提交請求丧肴,不同的數(shù)額残揉,由不同權(quán)限處理者處理
        for(int i = 0; i < requests.length; i++) {
            h1.HandleRequest(requests[i]);
        }
    }
}


職責(zé)鏈模式的好處

??職責(zé)鏈當(dāng)中最關(guān)鍵的是當(dāng)客戶提交一個請求時,請求是沿鏈傳遞直至有一個ConcreteHandler對象負(fù)責(zé)處理它芋浮。 這就使得接收者和發(fā)送者都沒有對方的明確信息抱环,且鏈中的對象自己也并不知道鏈的結(jié)構(gòu)。結(jié)果是職責(zé)鏈可簡化對象的相互連接,它們僅需保持一個指向其后繼者的引用镇草,而不需要保持它所有的候選者的引用眶痰。這也就大大降低了耦合度。
??在客戶端可以隨時地增加或修改處理一個請求的結(jié)構(gòu)陶夜,增強(qiáng)了給對象指派職責(zé)的靈活性凛驮。不過也需要當(dāng)心,一個請求極有可能到了鏈的末端都得不到處理条辟,或者因?yàn)闆]有正確配置而得不到處理黔夭。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市羽嫡,隨后出現(xiàn)的幾起案子本姥,更是在濱河造成了極大的恐慌,老刑警劉巖杭棵,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婚惫,死亡現(xiàn)場離奇詭異,居然都是意外死亡魂爪,警方通過查閱死者的電腦和手機(jī)先舷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滓侍,“玉大人蒋川,你說我怎么就攤上這事×冒剩” “怎么了捺球?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夕冲。 經(jīng)常有香客問我氮兵,道長,這世上最難降的妖魔是什么歹鱼? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任泣栈,我火速辦了婚禮,結(jié)果婚禮上醉冤,老公的妹妹穿的比我還像新娘秩霍。我一直安慰自己,他們只是感情好蚁阳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸽照,像睡著了一般螺捐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天定血,我揣著相機(jī)與錄音赔癌,去河邊找鬼。 笑死澜沟,一個胖子當(dāng)著我的面吹牛灾票,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茫虽,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼刊苍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了濒析?” 一聲冷哼從身側(cè)響起正什,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎号杏,沒想到半個月后婴氮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盾致,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年主经,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庭惜。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡罩驻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜈块,到底是詐尸還是另有隱情鉴腻,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布百揭,位于F島的核電站爽哎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏器一。R本人自食惡果不足惜课锌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祈秕。 院中可真熱鬧渺贤,春花似錦、人聲如沸请毛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽方仿。三九已至固棚,卻和暖如春统翩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背此洲。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工厂汗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呜师。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓娶桦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親汁汗。 傳聞我的和親對象是個殘疾皇子衷畦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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