1. 程式人生 > >【設計模式】——職責鏈模式(Chain Responsibility)

【設計模式】——職責鏈模式(Chain Responsibility)

行為型模式——職責鏈模式(Chain Responsibility)定義:
使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,知道有一個物件處理它位置。

職責鏈模式結構圖
在這裡插入圖片描述
部分程式碼理解
Handler類,定義一個處理請示的介面

//定義一個處理請示的介面
    abstract class Handler
    {
        protected Handler successor;
        public void SetSuccessor(Handler successor)//設定繼任者
        {
            this.successor = successor;
        }
        public abstract void HandleRequest(int request);//處理請求的抽象方法
    }

ConcreteHandler類,具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可處理該請求,就處理,否則就將該請求轉發給它的後繼者。

//請求數0-10之間有權處理,否則轉給下一位
    class ConcreteHandler1:Handler 
    {
        public override  void HandleRequest (int request)//void函式返回值
        {
            if (request >=0&& request<10)
            {
                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 ConcreteHander2();
            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();
        }
    }

職責鏈的好處
1.當需求中提出一個請求時,請求是沿鏈傳遞直至有一個具體處理者類(ConcreteHandler類)負責處理它。
2.降低了耦合度,接收者和傳送者都沒有對方的明確訊息,且鏈中的物件自己也不知道鏈的結構,結果是職責鏈可以簡化物件的相互連結,它們僅需保持一個指向其後繼者的引用,而不需要保持它所有的候選者的引用。
3.可以隨時隨地增加或修改處理一個請求的結構,增強了給物件指派職責的靈活性。

注意:處理者類的許可權問題。