輕鬆學會責任鏈模式

設計模式 - 責任鏈模式

顧名思義,責任鏈模式(Chain of Responsibility Pattern)爲請求建立了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬於行爲型模式。程序員

在這種模式中,一般每一個接收者都包含對另外一個接收者的引用。若是一個對象不能處理該請求,那麼它會把相同的請求傳給下一個接收者,依此類推。設計模式

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

介紹:

    • 意圖:避免請求發送者與接收者耦合在一塊兒,讓多個對象都有可能接收請求,將這些對象鏈接成一條鏈,而且沿着這條鏈傳遞請求,直到有對象處理它爲止。
    • 主要解決:職責鏈上的處理者負責處理請求,客戶只須要將請求發送到職責鏈上便可,無須關心請求的處理細節和請求的傳遞,因此職責鏈將請求的發送者和請求的處理者解耦了。在某一場景是能夠減小大量的if else代碼
    • 優勢: 一、下降耦合度。它將請求的發送者和接收者解耦。 二、簡化了對象。使得對象不須要知道鏈的結構。 三、加強給對象指派職責的靈活性。經過改變鏈內的成員或者調動它們的次序,容許動態地新增或者刪除責任。 四、增長新的請求處理類很方便。
    • 缺點: 一、不能保證請求必定被接收。 二、系統性能將受到必定影響,並且在進行代碼調試時不太方便,可能會形成循環調用。 三、可能不容易觀察運行時的特徵,有礙於除錯。
    話很少說直接上代碼

    建立一個抽象的程序員類:AbstractCoderide

    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) {
    
            //大於處理的權限
            if (this.level < level) {
                nextCoder.resolveBug(level, message);
            } else {
                write(message);
            }
        }
    
        abstract protected void write(String message);
    }

    建立不一樣的程序員類去擴展抽象類,每一個程序員作着不一樣的事情。性能

    LongHairCoder:this

    public class LongHairCoder extends AbstractCoder {
    
        public LongHairCoder(int level) {
            this.level = level;
        }
    
        @Override
        protected void write(String message) {
            System.out.println("初級程序員處理:" + 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);
        }
    
    }

    實現責任鏈: ChainPatternDemocode

    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,  "一個簡單的bug");
    
            abstractCoder.resolveBug(AbstractCoder.COMPLEXBUG, "一個複雜的bug");
    
            abstractCoder.resolveBug(AbstractCoder.DIFFICULTBUG,  "一個困難的bug");
        }
    
    
    }

    執行結果:對象

    初級程序員處理:一個簡單的bug
    禿頭程序員處理:一個複雜的bug
    光頭程序員處理:一個困難的bug
    相關文章
    相關標籤/搜索