設計模式是面向對象編程的基礎,是用於指導程序設計。在實際項目開發過程中,並不是一味將設計模式進行套用,也不是功能設計時大量引入設計模式。應該根據具體需求和要求應用適合的設計模式。設計模式是一個老話題了,因為最近在設計“網關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 聯系我,謝謝。
出處: http://www.cnblogs.com/Andon_liu
關於作者:專注於微軟平台項目架構、管理。熟悉設計模式、領域驅動、架構設計、敏捷開發和項目管理。現主要從事ASP.NET MVC、WCF/Web API、SOA、MSSQL、redis方面的項目開發、架構、管理工作。 如有問題或建議,請一起學習討論!
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
如有問題,可以郵件:568773262@qq.com 聯系我,謝謝。