"回到目錄" 職責鏈模式 它是一種設計模塊,主要將操作流程與具體操作解耦,讓每個操作都可以設置自己的操作流程,這對於工作流應用是一個不錯的選擇! 下麵是官方標準的定義:責任鏈模式是一種設計模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一 ...
職責鏈模式
它是一種設計模塊,主要將操作流程與具體操作解耦,讓每個操作都可以設置自己的操作流程,這對於工作流應用是一個不錯的選擇!
下麵是官方標準的定義:責任鏈模式是一種設計模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
職責鏈模式組成
- 三大對象
- 命令處理
- 處理流程
- 命令上下文
- 命令只負責組織各個流程的次序,對流程實現細節沒興趣
具體流程只實現自己關註的代碼,對下一個流程未知
在具體代碼中的體現
抽象命令
c# public interface ICommand { void Execute(CommandParameters parameters); }
抽象流程/// <summary> /// 工作流-抽象處理者 /// </summary> public abstract class WorkFlow { protected WorkFlow Next; // 定義後繼對象 protected object SharedObj; // 共用對象 // 設置後繼者 public WorkFlow SetNext(WorkFlow next) { Next = next; return next; } // 抽象請求處理方法 public virtual void ProcessRequest(CommandParameters command) { if (Next != null) Next.ProcessRequest(command); } }
命令需要把參數傳遞給每個工作流程
public class CommandParameters { public string CommandType { get; set; } public string JsonObj { get; set; } public CommandParameters(string type, string jsonObj) { CommandType = type; JsonObj = jsonObj; } }
下麵看一個職責鏈模式里的具體命令和具體流程(步驟),每個步驟可以設置它下一步是什麼
public class CommandInsert : ICommand { public void Execute(CommandParameters parameters) { WorkFlow workFlow = new WorkFlow_InsertLogger(); workFlow.SetNext(new WorkFlow_InsertAudit()); workFlow.ProcessRequest(parameters); } } public class CommandUpdate : ICommand { public void Execute(CommandParameters parameters) { WorkFlow workFlow = new WorkFlow_InsertAudit(); workFlow.SetNext(new WorkFlow_InsertLogger()); workFlow.ProcessRequest(parameters); } } public class WorkFlow_InsertLogger : WorkFlow { public override void ProcessRequest(CommandParameters command) { System.Console.WriteLine("WorkFlow1"); ProcessRequest(command); } } public class WorkFlow_InsertAudit : WorkFlow { public override void ProcessRequest(CommandParameters command) { System.Console.WriteLine("WorkFlow2"); ProcessRequest(command); } } public class ChainResponsibility { [Fact] public void Test1() { var command = new CommandInsert(); command.Execute(new CommandParameters("test", "OK")); } [Fact] public void Test2() { var command = new CommandUpdate(); command.Execute(new CommandParameters("test", "OK")); } }
待續……
回到目錄