1. 程式人生 > >設計模式----職責鏈模式

設計模式----職責鏈模式

        今天,我們來學習學習職責鏈模式,職責鏈模式,從字面上的意思還真的不好理解,我們要拆分來理解下,職責和鏈,職責不用解釋了就是自己需要做的事,那麼鏈呢,何為鏈,就是鎖鏈嘛!我們都知道鎖鏈一般是由一環一環的圓圈構成的,哎,一環一環,這一環是不是就是我們軟體世界中的物件呢?那麼連起來的意思就是把職責像鏈一樣一環一環連起來,那麼,就構成了我們所說的職責鏈模式了,那麼為什麼會有職責鏈模式呢?這還不是為了解耦嘛,為嘛解耦,不就是為了複用嘛,為嘛複用,還不是為了偷懶嘛,所以,歸咎起來,職責鏈模式就是為了偷懶(哈哈),接下來的時間,就讓我們來仔細講講如何偷懶。

        不知道你有沒有寫過很複雜的業務邏輯呢?是不是寫了無數個if和else再加無數個if和else呢?,雖然最後酣暢淋漓的寫出來之後有一種特別暢快的感覺,但是,一測試,你會發現,你的邏輯錯到家了,然後再回過頭來看自己寫的程式碼,臥槽,這寫的啥,層層巢狀的if  else 看的人頭皮發麻,今天,我們的職責鏈雖然不是完全解決這種問題的方案,但是,職責鏈能教給我們一種抽離判斷的思路。好,廢話不多說,我們進入今天的正題,職責鏈,我們應該抽象什麼呢?職責??組成鏈的圓圈,不,這些都不夠,我們應該抽象一個擔任職責的物件來,請看程式碼

abstract class Handler
    {
        protected Handler sueecssor;
        public void SetSuccerssor(Handler sueecssor)
        {
            this.sueecssor = sueecssor;
        }
        public abstract void HandleRequest(int request);
    }

Handler類就是我們今天所要的擔任職責的抽象物件,首先我們看到它的內部定義了一個型別為自己的sueecssor屬性,注意,這個屬性不是私有的,這樣的目的是為了什麼呢?其實就是為了構成我們的鏈,這個屬性就是我們職責的連結,具體怎麼連結,我們看下面的程式碼

 class ConcreteHandler1 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 0 && request < 10)
            {
                Console.WriteLine("{0} 處理請求{1}",
                this.GetType().Name, request);
            }
            else if (sueecssor != null) sueecssor.HandleRequest(request);

        }
    }

        這個ConcreteHandler1類,我們實現了Handler抽象類,重寫了抽象類中的Handlerequest方法,我們仔細看方法內部,如果傳入的引數不滿足條件的話,那麼控制權就教給我們下一個處理者,怎麼交,就是通過我們剛剛抽象類中的sueecssor屬性,可能還是不太好理解,這樣,我們通過客戶端呼叫來理解

class Program
    {
        static void Main(string[] args)
        {
            ConcreteHandler1 concrete0 = new ConcreteHandler1();
            ConcreteHandler1 concrete1 = new ConcreteHandler1();
            ConcreteHandler1 concrete2 = new ConcreteHandler1();
            concrete0.HandleRequest(9);
            concrete0.SetSuccerssor(concrete1);
            concrete1.SetSuccerssor(concrete2);
            Console.Read();
        }
    }

       我們用ConcreteHandler1類聲明瞭三個例項,分別是concrete0、concrete1、concrete2,首先,我們先用0職責類來判斷,然後新增concrete1來判斷,再接著新增concrete2來判斷,這樣是不是就像鏈條一樣一環扣一環呢?接著我們來說說為什麼例項化的子類可以呼叫父類的方法呢?首先,我們在例項化ConcreteHandler1類的時候,由於它是繼承自Handler類的,所以首先會去建立Handle抽象類,然後才能建立子類,所以這就是為什麼子類能用父類中方法的原因,所以,之前宣告的sueecssor屬性就是為了只讓其能在子類中呼叫才宣告為protected,到這裡,我們的職責鏈就完