責(zé)任鏈模式 ~ 設(shè)計(jì)模式之三

責(zé)任重于泰山,咱再來看看責(zé)任鏈模式鳍鸵。
這里的責(zé)任我理解為兩種責(zé)任:
1)一種是自我責(zé)任苇瓣,自己的任務(wù),自己認(rèn)真做好偿乖,保證任務(wù)的質(zhì)量
2)另一種是整體責(zé)任击罪,當(dāng)不屬于自己的任務(wù),或是自己不能擔(dān)當(dāng)?shù)奶靶剑瑧?yīng)盡快交給能完成他的人媳禁,保證整體效率的提高

1. 定義

有點(diǎn)像流水線的模式,前一個(gè)流程處理完了画切,交給下一個(gè)流程處理竣稽,是一個(gè)自動(dòng)流程鏈處理的過程,要進(jìn)入整個(gè)流程很簡單霍弹,
只需要知道第一個(gè)流程節(jié)點(diǎn)的位置就可以毫别,且各個(gè)流程節(jié)點(diǎn)也不需要關(guān)心其他節(jié)點(diǎn)的處理過程。
注:可能存在某一次流水線過程典格,比如一共10個(gè)環(huán)節(jié)岛宦,而實(shí)際呢,只有5個(gè)環(huán)節(jié)參與了流程耍缴,這個(gè)就是要看具體加工的產(chǎn)品需要
哪個(gè)環(huán)節(jié)來處理砾肺。

2. 優(yōu)點(diǎn)

  1. 降低了處理對(duì)象與自身的關(guān)聯(lián)關(guān)系
  2. 擴(kuò)展性增加,需要增加處理流程時(shí)防嗡,隨時(shí)動(dòng)態(tài)增加到流程的具體位置即可
  3. 可以動(dòng)態(tài)調(diào)整節(jié)點(diǎn)变汪,包括更換位置、或是刪除
  4. 前后流程維護(hù)較方便本鸣,只需要保留后一個(gè)節(jié)點(diǎn)的引用即可
  5. 職責(zé)分工明確疫衩,各個(gè)節(jié)點(diǎn)只需要負(fù)責(zé)自己的處理即可

3. 缺點(diǎn)

  1. 請(qǐng)求處理的隨機(jī)性,可能被流程中的過程環(huán)節(jié)處理到荣德,也可能一個(gè)環(huán)節(jié)也沒有處理
  2. 如果流程環(huán)節(jié)較長闷煤,可能對(duì)系統(tǒng)性能有一定的影響

4. 結(jié)構(gòu)

  • 抽象處理類:主要包括處理的抽象方法,及下一個(gè)流程節(jié)點(diǎn)的維護(hù)
  • 具體處理類:具體的流程處理方法 涮瞻,大概包括:本節(jié)點(diǎn)是否需要執(zhí)行鲤拿,以及負(fù)責(zé)把流程流轉(zhuǎn)到下一個(gè)節(jié)點(diǎn)
  • 客戶端:負(fù)責(zé)向流程的第一個(gè)處理節(jié)點(diǎn)發(fā)起請(qǐng)求,不需要關(guān)心后續(xù)的流程和處理過程

5. 實(shí)現(xiàn)

一般來說署咽,汽車生產(chǎn)分為4個(gè)環(huán)節(jié)近顷,沖壓生音、焊接、涂裝窒升、總裝缀遍。
當(dāng)然真實(shí)的流水線,是挨個(gè)順序來的饱须,當(dāng)然呢域醇,也有可能某一個(gè)零件是中間的一個(gè)步驟,下面的邏輯可以支持中間過程的零件生產(chǎn)蓉媳。

//處理抽象類
abstract class CarProducerHandler {
    //下一個(gè)流程的引用
    private CarProducerHandler next;

    public CarProducerHandler getNext() {
        return next;
    }

    public void setNext(CarProducerHandler next) {
        this.next = next;
    }
    
    //處理請(qǐng)求的方法
    public abstract void produceHandler(String request);
}

//沖壓環(huán)節(jié)
class StampingHandler extends CarProducerHandler {

    @Override
    public void produceHandler(String request) {
        if(request.equals("stamping")) {
            System.out.println("我來處理沖壓任務(wù)");
                        //這樣我們可以流轉(zhuǎn)到下一個(gè)環(huán)節(jié)進(jìn)行生產(chǎn)
            getNext().produceHandler("welding");
        }else {
            if(getNext()!=null) {
                getNext().produceHandler(request);
            }else {
                System.out.println("當(dāng)前無人處理請(qǐng)求");
            }
        }
    }
}

//焊接環(huán)節(jié)
class WeldingHandler extends CarProducerHandler {

    @Override
    public void produceHandler(String request) {
        if(request.equals("welding")) {
            System.out.println("我來處理焊接任務(wù)");
            getNext().produceHandler("painting");
        }else {
            if(getNext()!=null) {
                getNext().produceHandler(request);
            }else {
                System.out.println("當(dāng)前無人處理請(qǐng)求");
            }
        }
    }
}

//油漆環(huán)節(jié)
class PaintingHandler extends CarProducerHandler {

    @Override
    public void produceHandler(String request) {
        if(request.equals("painting")) {
            System.out.println("我來處理涂裝任務(wù)");
            getNext().produceHandler("assembly");
        }else {
            if(getNext()!=null) {
                getNext().produceHandler(request);
            }else {
                System.out.println("當(dāng)前無人處理請(qǐng)求");
            }
        }
    }
}

//總裝環(huán)節(jié)
class AssemblyHandler extends CarProducerHandler {

    @Override
    public void produceHandler(String request) {
        if(request.equals("assembly")) {
            System.out.println("我來處理總裝任務(wù)譬挚,全結(jié)束");
        }else {
            if(getNext()!=null) {
                getNext().produceHandler(request);
            }else {
                System.out.println("當(dāng)前無人處理請(qǐng)求");
            }
        }
    }
}

public class ChainPatternTest {
    public static void main(String[] args) {
                //四大環(huán)節(jié)
        StampingHandler stampingHandler = new StampingHandler();
        WeldingHandler weldingHandler = new WeldingHandler();
        PaintingHandler paintingHandler = new PaintingHandler();
        AssemblyHandler assemblyHandler = new AssemblyHandler();
        
                //建立四大環(huán)節(jié)的前后關(guān)系
        stampingHandler.setNext(weldingHandler);
        weldingHandler.setNext(paintingHandler);
        paintingHandler.setNext(assemblyHandler);
        
                //這個(gè)例子是從一開始的沖壓環(huán)節(jié)開始
        stampingHandler.produceHandler("stamping");
        System.out.println("-------------------------");
                //這個(gè)例子我們從涂裝開始
        stampingHandler.produceHandler("painting");
    }
}
//下面的輸出的結(jié)果
//例子1:從沖壓開始
//我來處理沖壓任務(wù)
//我來處理焊接任務(wù)
//我來處理涂裝任務(wù)
//我來處理總裝任務(wù),全結(jié)束
//-------------------------
//例子2:從涂裝開始
//我來處理涂裝任務(wù)
//我來處理總裝任務(wù)酪呻,全結(jié)束

當(dāng)然了减宣,也可以簡單一點(diǎn),任務(wù)只有一個(gè)節(jié)點(diǎn)負(fù)責(zé)處理玩荠,你想想漆腌,該怎么來改呢,歡迎回復(fù)姨蟋!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屉凯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子眼溶,更是在濱河造成了極大的恐慌悠砚,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堂飞,死亡現(xiàn)場離奇詭異灌旧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绰筛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門枢泰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铝噩,你說我怎么就攤上這事衡蚂。” “怎么了骏庸?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵毛甲,是天一觀的道長。 經(jīng)常有香客問我具被,道長玻募,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任一姿,我火速辦了婚禮七咧,結(jié)果婚禮上跃惫,老公的妹妹穿的比我還像新娘。我一直安慰自己艾栋,他們只是感情好爆存,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裹粤,像睡著了一般终蒂。 火紅的嫁衣襯著肌膚如雪蜂林。 梳的紋絲不亂的頭發(fā)上遥诉,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音噪叙,去河邊找鬼矮锈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛睁蕾,可吹牛的內(nèi)容都是我干的苞笨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼子眶,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼瀑凝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起臭杰,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤粤咪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后渴杆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寥枝,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年磁奖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了囊拜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡比搭,死狀恐怖冠跷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情身诺,我是刑警寧澤蜜托,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站戚长,受9級(jí)特大地震影響盗冷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜同廉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一仪糖、第九天 我趴在偏房一處隱蔽的房頂上張望柑司。 院中可真熱鬧,春花似錦锅劝、人聲如沸攒驰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玻粪。三九已至,卻和暖如春诬垂,著一層夾襖步出監(jiān)牢的瞬間劲室,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工结窘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留很洋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓隧枫,卻偏偏與公主長得像喉磁,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子官脓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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