回到目录

职责链模式

它是一种设计模块,主要将操作流程与具体操作解耦,让每个操作都可以设置自己的操作流程,这对于工作流应用是一个不错的选择!

下面是官方标准的定义:责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

职责链模式组成

  1. 三大对象
  2. 命令处理
  3. 处理流程
  4. 命令上下文
  • 命令只负责组织各个流程的次序,对流程实现细节没兴趣
  • 具体流程只实现自己关注的代码,对下一个流程未知

在具体代码中的体现

抽象命令

 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"));
}
}

待续……

回到目录

LindDotNetCore~职责链模式的应用的更多相关文章

  1. JavaScript之职责链模式

    一.概述 职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有 ...

  2. C#设计模式系列:职责链模式(Chain of Responsibility)

    1.职责链模式简介 1.1>.定义 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对 ...

  3. php实现设计模式之 职责链模式

    <?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * 抽象 ...

  4. Filter体现职责链模式

    1. 前言 Filter—Filter 技术是servlet2.3 新增加的功能.完成的流程:对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后 ...

  5. Js 职责链模式 简单理解

    js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...

  6. JAVA 设计模式 职责链模式

    用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...

  7. 职责链模式(chain of responsibility)

    一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...

  8. 5.js模式-职责链模式

    1. 职责链模式 将对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. var chain = function(fn){ this.fn = fn; this.successor = ...

  9. 17. 星际争霸之php设计模式--职责链模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

随机推荐

  1. SpringCloud实战8-Bus消息总线

    好了现在我们接着上一篇的随笔,继续来讲.上一篇我们讲到,我们如果要去更新所有微服务的配置,在不重启的情况下去更新配置,只能依靠spring cloud config了,但是,是我们要一个服务一个服务的 ...

  2. BZOJ_3894_文理分科&&BZOJ_2127_happiness_最小割

    BZOJ_3894_文理分科_最小割 Description  文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过)  小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进 ...

  3. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

  4. BZOJ_2820_YY的GCD_莫比乌斯反演

    BZOJ_2820_YY的GCD_莫比乌斯反演 题意&分析: 首先f[i]非积性,但可以通过μ处理,所以我们考虑线筛 f[i*p]=μ[i*p/p']; 1.当i为质数时f[i]=1; 2.当 ...

  5. sql查询当前登陆人所管理的校区下的人员

    StringBuilder sql = new StringBuilder("select accountId, concat( ',', GROUP_CONCAT(FIND_IN_SET( ...

  6. 禁用后退键 BackSpace

    <script language="JavaScript">document.onkeydown = check;function check(e) {    var  ...

  7. vue中引入babel步骤

    vue中引入babel步骤 vue项目中普遍使用es6语法,但有时我们的项目需要兼容低版本浏览器,这时就需要引入babel插件,将es6转成es5. 1.安装babel-polyfill插件 npm ...

  8. 认识容器和Docker(一)

    前言: 这句话应该是开发人员经常挂在嘴边的吧! “在我的机器上是正常工作的啊,MD,怎么到你这就不行了?” 开发人员就会联想到: 1. 肯定是你环境有问题: 2. 要么就是你个傻*不会用吧: 带着这句 ...

  9. MIP 与 AMP 合作进展(3月7日)

    "到目前为止,全网通过 MIP 校验的网页已超10亿.除了代码和缓存, MIP 还想做更多来改善用户体验移动页面." 3月7日,MIP 项目负责人在首次 AMP CONF 上发言. ...

  10. Spark学习之RDD编程总结

    Spark 对数据的核心抽象——弹性分布式数据集(Resilient Distributed Dataset,简称 RDD).RDD 其实就是分布式的元素集合.在 Spark 中,对数据的所有操作不外 ...