C#設計模式:責任鏈模式


   設計模式是面向對象編程的基礎,是用於指導程序設計。在實際項目開發過程中,並不是一味將設計模式進行套用,也不是功能設計時大量引入設計模式。應該根據具體需求和要求應用適合的設計模式。設計模式是一個老話題了,因為最近在設計“網關API”組件(后續介紹),采用“責任鏈設計模式”進行設計,所以先進行回顧記錄。

 一、責任鏈模式介紹

  責任鏈模式是指一個處理需要涉及多個過程或者角色參與處理,並基於某個約定組成一個鏈,每個過程或者角色擁有各自職責進行處理。責任鏈模式有效組織一個過程處理,同時子過程之間職責明確。在.NET平台中很常見此模式應用。例如管道方式就可以采用責任鏈模式進行設計實現。

 

二、責任鏈模式結構圖

   如下圖所示,此類圖就是責任鏈模式核心的結構圖,常見定義一個接口各子過程基礎此接口實現,通過接口進行解耦子過程之間依賴。

 

三、責任鏈模式實現

  通過如下簡單DEMO進行展示責任鏈的實現。定義一個接口(Ihandler)、三個實現類(AHandler、BHandler、CHandler)和一個上下文類(PipelContext)。

public interface IHandler
{
     PipelContext DoAction(PipelContext pipelContext);
}
public class AHandler : IHandler
    {
        private IHandler NextHandler { get; set; }

        public AHandler(IHandler nextHandler)
        {
            NextHandler = nextHandler;
        }

        public PipelContext DoAction(PipelContext pipelContext)
        {
            bool isNext = (pipelContext.Flag < 20) ? true : false;
            pipelContext.request = "AA";
            Console.WriteLine("my is " + pipelContext.request);

            if (NextHandler != null && isNext)
            {
                NextHandler.DoAction(pipelContext);
            }
            return pipelContext;
        }
    }

    public class BHandler : IHandler
    {
        private IHandler NextHandler { get; set; }

        public BHandler(IHandler nextHandler)
        {
            NextHandler = nextHandler;
        }

        public PipelContext DoAction(PipelContext pipelContext)
        {
            bool isNext = (pipelContext.Flag < 10) ? true : false;
            pipelContext.request = "BB";
            Console.WriteLine("my is " + pipelContext.request);
            
            if (NextHandler != null && isNext)
            {
                NextHandler.DoAction(pipelContext);
            }

            return pipelContext;
        }
    }

    public class CHandler : IHandler
    {
        private IHandler NextHandler { get; set; }

        public CHandler(IHandler nextHandler)
        {
            NextHandler = nextHandler;
        }

        public PipelContext DoAction(PipelContext pipelContext)
        {
            bool isNext = (pipelContext.Flag < 5) ? true : false;
            pipelContext.request = "CC";
            Console.WriteLine("my is " + pipelContext.request);

            if (NextHandler != null && isNext)
            {
                NextHandler.DoAction(pipelContext);
            }
            return pipelContext;
        }
    }
public class PipelContext
    {
        public PipelContext()
        {
            Key = Guid.NewGuid();
        }

        public Guid Key { get; set; }

        public int Flag { get; set; }

        public string request { get; set; }

        public string respone { get; set; }
    }
static void Main(string[] args)
        {
            IHandler ModuleC = new CHandler(null);
            IHandler ModuleB = new BHandler(ModuleC);
            IHandler ModuleA = new AHandler(ModuleB);

            PipelContext p = new PipelContext();
            while (true)
            {
                p.Flag = Convert.ToInt32(Console.ReadLine());
                ModuleA.DoAction(p);
            }          
        }

 

四、總結

  上述只是一個很簡單的責任鏈模式,實際應用中根據需求,子過程可以采用可配置方式實現熱插拔式,提升靈活、擴展及可維護。

  

作者:劉蔡濤
出處: http://www.cnblogs.com/Andon_liu
關於作者:專注於微軟平台項目架構、管理。熟悉設計模式、領域驅動、架構設計、敏捷開發和項目管理。現主要從事ASP.NET MVC、WCF/Web API、SOA、MSSQL、redis方面的項目開發、架構、管理工作。 如有問題或建議,請一起學習討論!
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
如有問題,可以郵件:568773262@qq.com 聯系我,謝謝。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM