成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

輕松學(xué)會(huì)責(zé)任鏈模式

cheukyin / 1993人閱讀

摘要:設(shè)計(jì)模式責(zé)任鏈模式顧名思義,責(zé)任鏈模式為請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈。這種模式給予請(qǐng)求的類型,對(duì)請(qǐng)求的發(fā)送者和接收者進(jìn)行解耦。增強(qiáng)給對(duì)象指派職責(zé)的靈活性。通過改變鏈內(nèi)的成員或者調(diào)動(dòng)它們的次序,允許動(dòng)態(tài)地新增或者刪除責(zé)任。

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

顧名思義,責(zé)任鏈模式(Chain of Responsibility Pattern)為請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈。這種模式給予請(qǐng)求的類型,對(duì)請(qǐng)求的發(fā)送者和接收者進(jìn)行解耦。這種類型的設(shè)計(jì)模式屬于行為型模式。

在這種模式中,通常每個(gè)接收者都包含對(duì)另一個(gè)接收者的引用。如果一個(gè)對(duì)象不能處理該請(qǐng)求,那么它會(huì)把相同的請(qǐng)求傳給下一個(gè)接收者,依此類推。

簡單的說就是: 你處理不了的事情就交給你的下一級(jí)(級(jí)別更高)的去處理。
介紹:

意圖:避免請(qǐng)求發(fā)送者與接收者耦合在一起,讓多個(gè)對(duì)象都有可能接收請(qǐng)求,將這些對(duì)象連接成一條鏈,并且沿著這條鏈傳遞請(qǐng)求,直到有對(duì)象處理它為止。

主要解決:職責(zé)鏈上的處理者負(fù)責(zé)處理請(qǐng)求,客戶只需要將請(qǐng)求發(fā)送到職責(zé)鏈上即可,無須關(guān)心請(qǐng)求的處理細(xì)節(jié)和請(qǐng)求的傳遞,所以職責(zé)鏈將請(qǐng)求的發(fā)送者和請(qǐng)求的處理者解耦了。在某一場景是可以減少大量的if else代碼

優(yōu)點(diǎn): 1、降低耦合度。它將請(qǐng)求的發(fā)送者和接收者解耦。 2、簡化了對(duì)象。使得對(duì)象不需要知道鏈的結(jié)構(gòu)。 3、增強(qiáng)給對(duì)象指派職責(zé)的靈活性。通過改變鏈內(nèi)的成員或者調(diào)動(dòng)它們的次序,允許動(dòng)態(tài)地新增或者刪除責(zé)任。 4、增加新的請(qǐng)求處理類很方便。

缺點(diǎn): 1、不能保證請(qǐng)求一定被接收。 2、系統(tǒng)性能將受到一定影響,而且在進(jìn)行代碼調(diào)試時(shí)不太方便,可能會(huì)造成循環(huán)調(diào)用。 3、可能不容易觀察運(yùn)行時(shí)的特征,有礙于除錯(cuò)。

話不多說直接上代碼

創(chuàng)建一個(gè)抽象的程序員類:AbstractCoder

public abstract class AbstractCoder {

    public static int SIMPLEBUG = 1;
    public static int COMPLEXBUG = 2;
    public static int DIFFICULTBUG = 3;


    protected int level;

    protected AbstractCoder nextCoder;

    public void setNextCoder(AbstractCoder nextCoder) {
        this.nextCoder = nextCoder;
    }

    public void resolveBug(int level, String message) {

        //大于處理的權(quán)限
        if (this.level < level) {
            nextCoder.resolveBug(level, message);
        } else {
            write(message);
        }
    }

    abstract protected void write(String message);
}

創(chuàng)建不同的程序員類去擴(kuò)展抽象類,每個(gè)程序員做著不同的事情。

LongHairCoder:

public class LongHairCoder extends AbstractCoder {

    public LongHairCoder(int level) {
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("初級(jí)程序員處理:" + message);
    }
}

ShortHairCoder:

public class ShortHairCoder extends AbstractCoder {

    public ShortHairCoder(int level) {
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("禿頭程序員處理:" + message);
    }
}

BaldHeadCoder:

public class BaldHeadCoder extends AbstractCoder {

    public BaldHeadCoder(int level) {
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("光頭程序員處理:" + message);
    }

}

實(shí)現(xiàn)責(zé)任鏈: ChainPatternDemo

public class ChainPattern {

    public static AbstractCoder getChainOfLoggers() {

        AbstractCoder longHairCoder = new LongHairCoder(AbstractCoder.SIMPLEBUG);
        AbstractCoder shortHairCoder = new ShortHairCoder(AbstractCoder.COMPLEXBUG);
        AbstractCoder baldHeadCoder = new BaldHeadCoder(AbstractCoder.DIFFICULTBUG);

        longHairCoder.setNextCoder(shortHairCoder);
        shortHairCoder.setNextCoder(baldHeadCoder);

        return longHairCoder;
    }

    public static void main(String[] args) {
        AbstractCoder abstractCoder = getChainOfLoggers();

        abstractCoder.resolveBug(AbstractCoder.SIMPLEBUG,  "一個(gè)簡單的bug");

        abstractCoder.resolveBug(AbstractCoder.COMPLEXBUG, "一個(gè)復(fù)雜的bug");

        abstractCoder.resolveBug(AbstractCoder.DIFFICULTBUG,  "一個(gè)困難的bug");
    }


}

執(zhí)行結(jié)果:

初級(jí)程序員處理:一個(gè)簡單的bug
禿頭程序員處理:一個(gè)復(fù)雜的bug
光頭程序員處理:一個(gè)困難的bug

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73564.html

相關(guān)文章

  • 假如時(shí)光倒流,我會(huì)這么學(xué)習(xí)Java

    摘要:看起來沒有集合框架,線程,等那么耀眼,但它可是很多框架的基礎(chǔ)啊回復(fù)反射查看相關(guān)文章,先把基礎(chǔ)學(xué)會(huì),后面的得用到它。 回頭看看, 我進(jìn)入Java 領(lǐng)域已經(jīng)快15個(gè)年頭了, 雖然學(xué)的也一般, 但是分享下我的心得,估計(jì)也能幫大家少走點(diǎn)彎路。[入門]我在2001年之前是C/C++陣營, 有C和面向?qū)ο蟮幕A(chǔ), 后來轉(zhuǎn)到Java ,發(fā)現(xiàn)沒有指針的Java真是好簡單, 另外Java 的類庫好用的讓...

    bladefury 評(píng)論0 收藏0
  • 又被面試官問設(shè)計(jì)模式了,我真的是

    摘要:面試官要不你來手寫下單例模式唄候選者單例模式一般會(huì)有好幾種寫法候選者餓漢式簡單懶漢式在方法聲明時(shí)加鎖雙重檢驗(yàn)加鎖進(jìn)階懶漢式靜態(tài)內(nèi)部類優(yōu)雅懶漢式枚舉候選者所謂餓漢式指的就是還沒被用到,就直接初始化了對(duì)象。面試官:我看你的簡歷寫著熟悉常見的設(shè)計(jì)模式,要不你來簡單聊聊你熟悉哪幾個(gè)吧?候選者:常見的工廠模式、代理模式、模板方法模式、責(zé)任鏈模式、單例模式、包裝設(shè)計(jì)模式、策略模式等都是有所了解的候選者:...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • 利用責(zé)任模式設(shè)計(jì)一個(gè)攔截器

    摘要:前言近期在做的攔截器功能,正好用到了責(zé)任鏈模式。通過官方圖就可以非常清楚的看出是一個(gè)責(zé)任鏈模式用責(zé)任鏈模式設(shè)計(jì)一個(gè)攔截器對(duì)于攔截器來說使用責(zé)任鏈模式再好不過了。設(shè)置攔截器到責(zé)任鏈中時(shí)通過反射將的值保存到各個(gè)攔截器中。 showImg(https://segmentfault.com/img/remote/1460000016756077?w=1733&h=1300); 前言 近期在做 ...

    dreamans 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<