職責鏈(Chain of Responsibility)模式

1、 職責鏈(Chainof Responsibility)模式ide

責任鏈模式是一種對象的行爲模式。在責任鏈模式裏,不少對象由每個對象對其下家的引用而鏈接起來造成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪個對象最終處理這個請求,這使得系統能夠在不影響客戶端的狀況下動態地從新組織鏈和分配責任。this

2、 責任鏈模式的結構spa

責任鏈模式涉及到的角色以下所示:code

抽象處理者(Handler)角色:定義出一個處理請求的接口。若是須要,接口能夠定義出一個方法,以設定和返回對下家的引用。這個角色一般由一個抽象類或接口實現。對象

具體處理者(ConcreteHandler)角色:具體處理者接到請求後,能夠選擇將請求處理掉,或者將請求傳給下家。因爲具體處理者持有對下家的引用,所以,若是須要,具體處理者能夠訪問下家。接口

模式理解圖:requests


示例源代碼:string

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Chain_of_Responsibility
{
    abstract class Handler
    {
        protected Handler successor;

        public void setSuccessor(Handler successor)
        {
            this.successor = successor;
        }
        abstract public void HandleRequest(int request);
     }

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

    class ConcreteHandler2 : Handler
    {
        public override void HandleRequest(int request)
        {
            //throw new NotImplementedException();
            if (request >= 10 && request < 20)
                Console.WriteLine("{0} handled request {1}", this, request);
            else
                if (successor != null)
                    successor.HandleRequest(request);
        }
    }
    class ConcreteHandler3 : Handler
    {
        public override void HandleRequest(int request)
        {
            //throw new NotImplementedException();
            if (request >= 20 && request < 30)
            {
                Console.WriteLine("{0} handled request {1}", this, 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);
            h3.setSuccessor(h1);          //像一條鏈路,每一個對象都有對下一個對象的引用。
                                                    
            int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

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

            Console.ReadKey();
        }
    }
}

結果截圖:it


類圖:io


關係圖:

相關文章
相關標籤/搜索