設計模式(十八):責任鏈模式

K戰神發表於2016-01-22

一、定義

請求在這個鏈上傳遞,直到鏈上的某一個物件決定處理此請求。

發出這個請求的客戶端並不知道鏈上的哪一個物件最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。

二、例項

其實和狀態模式類似,只是狀態模式在具體的子類中指定了下一個具體的處理物件。而責任鏈模式,可以在客戶端動態的組織鏈的規則和責任。

首先,上下文類:

public class Context
    {
        public string Suffix { get; set; }        
    }

其次,抽象責任

 public abstract class BaseHttpModule
    {
        public BaseHttpModule NextHttpModule { get; set; }
        public abstract void Requsest(Context context);
    }

具體實現:

  public class FirstHttpModule : BaseHttpModule
    {
        public override void Requsest(Context context)
        {
            if (context.Suffix == ".aspx")
            {
                Console.WriteLine("檔案字尾為:{0}", context.Suffix);
            }
            else if (NextHttpModule != null)
            {
                NextHttpModule.Requsest(context);
            }
        }
    }
 public class LastHttpModule : BaseHttpModule
    {
        public override void Requsest(Context context)
        {
            if (context.Suffix == ".cshtml")
            {
                Console.WriteLine("檔案字尾為:{0}", context.Suffix);
            }
            else if (NextHttpModule != null)
            {
                NextHttpModule.Requsest(context);
            }
        }
    }

客戶端:

 //------------------------責任鏈模式----------------------
            Responsibility.Context resquestContext = new Responsibility.Context();
            resquestContext.Suffix = ".cshtml";

            Responsibility.BaseHttpModule aspx = new Responsibility.FirstHttpModule();
            Responsibility.BaseHttpModule cshtml = new Responsibility.LastHttpModule();
            aspx.NextHttpModule = cshtml;

            aspx.Requsest(resquestContext);
            Console.ReadKey();

結果:

三、總結

責任鏈 可以動態串聯責任

狀態模式 流程在子類中已經確定。

相關文章