20、職責鏈模式

職責鏈模式:

職責鏈模式(Chain of Responsibility):使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這個對象鏈接成一條鏈,並沿着這條鏈傳遞該請求,直到有一個(ConcreteHandler)對象處理它爲止。c#

職責鏈模式UML結構圖:ide

這裏發出的請求,客戶端並不知道這當中的哪個對象最終處理這個請求,這樣系統的更改能夠在不影響客戶端的狀況下動態地從新組織和分配任務。this

職責鏈模式使得接收者和發送者都沒有對方的明確信息,且鏈中的對象本身也不知道鏈的結構,簡化了對象的相互鏈接,它們僅須要保持一個指向其後繼者的引用,而不須要保持它全部的候選接收者的引用,這樣耦合度就大大下降了。(咱們能夠隨時增長或者修改處理一個請求的結構,增長了給對象指派職責的靈活性)(可是也須要考慮到請求可能到了鏈的末端都沒法獲得處理的狀況或者由於沒有正確配置而得不處處理,那樣就變得糟糕了)code

基本代碼:對象

abstract class Handler
    {
        protected Handler successor;

        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }

        public abstract void HandleRequest(int request);
    }

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

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

    class ConcreteHandler3 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 20 && request < 30)
            {
                Console.WriteLine("{0}  處理請求  {1}",
                  this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request);
            }
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Handler h1 = new ConcreteHandler1();
            Handler h2 = new ConcreteHandler2();
            Handler h3 = new ConcreteHandler3();
            h1.SetSuccessor(h2);
            h2.SetSuccessor(h3);

            int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

            foreach (int request in requests)
            {
                h1.HandleRequest(request);
            }

            Console.Read();

        }
    }
相關文章
相關標籤/搜索