职责链模式
它是一种设计模块,主要将操作流程与具体操作解耦,让每个操作都可以设置自己的操作流程,这对于工作流应用是一个不错的选择!
下面是官方标准的定义:责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
职责链模式组成
- 三大对象
- 命令处理
- 处理流程
- 命令上下文
- 命令只负责组织各个流程的次序,对流程实现细节没兴趣
-
具体流程只实现自己关注的代码,对下一个流程未知
在具体代码中的体现
抽象命令
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")); } }
待续……