設計模式是面向對象編程的基礎,是用於指導程式設計。在實際項目開發過程中,並不是一味將設計模式進行套用,也不是功能設計時大量引入設計模式。應該根據具體需求和要求應用適合的設計模式。設計模式是一個老話題了,因為最近在設計“網關API”組件(後續介紹),採用“責任鏈設計模式”進行設計,所以先進行回顧記錄。 ...
設計模式是面向對象編程的基礎,是用於指導程式設計。在實際項目開發過程中,並不是一味將設計模式進行套用,也不是功能設計時大量引入設計模式。應該根據具體需求和要求應用適合的設計模式。設計模式是一個老話題了,因為最近在設計“網關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方面的項目開發、架構、管理工作。 如有問題或建議,請一起學習討論!
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
如有問題,可以郵件:[email protected] 聯繫我,謝謝。