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

設計模式——職責鏈模式

使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞請求,直到有一個物件處理他為止。

namespace 職責鏈模式
{
    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, 8, 11, 14, 24, 44 };
            foreach (int request in requests)
            {
                h1.HandleRequest(request);
            }
            Console.Read();
        }
    }
}

優點:

當客戶提交一個請求的時候,請求是沿鏈傳遞直至有一個ConcreteHandler物件負責處理它。

使得接收者和傳送者都沒有對方的明確資訊,且鏈中的物件自己也並不知道鏈的結構。結果是職責鏈可簡化為物件的相互連線,它們僅需保持一個指向其後繼者的引用,而不需要保持它的所有候選者接受者的引用。

可以隨時增加或者修改處理一個請求的結構。增強了給物件指派職責的靈活性。

但是,一個請求極有可能到了鏈的末端都得不到處理,這種情況需要考慮全域性。