回到目录

职责链模式

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

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

职责链模式组成

  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. HashMap浅入理解

    HashMap不能保证元素的顺序,HashMap能够将键设为null,也可以将值设为null,与之对应的是Hashtable,(注意大小写:不是HashTable),Hashtable不能将键和值设为 ...

  2. System.out.println()

    System是java.lang中的类,out为System中的一个静态数据成员,out是java.io.PrintStream类的对象,而println()是java.io.PrintStream类 ...

  3. BZOJ_1598_[Usaco2008 Mar]牛跑步_A*

    BZOJ_1598_[Usaco2008 Mar]牛跑步_A* Description BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. B ...

  4. python——在文件存放路径下自动创建文件夹!

    1.a.py文件存放的路径下为(D:\Auto\eclipse\workspace\Testhtml\Test) 2.通过os.getcwd()获取的路径为:D:\Auto\eclipse\works ...

  5. RVM 安装 Ruby

    RVM 是一个命令行工具,可以提供一个便捷的多版本 Ruby 环境的管理和切换. https://rvm.io/ 如果你打算学习 Ruby / Rails, RVM 是必不可少的工具之一. 这里所有的 ...

  6. Spring 系列之Spring常用注解总结

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.实物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文 ...

  7. 滴滴 App 的质量优化框架 Booster,开源了!

    一. 序 当 App 达到一定体量的时候,肯定是要考虑质量优化.有些小问题,看似只有 0.01% 触发率,但是如果发生在 DAU 过千万的产品中,就很严重了. 滴滴这个独角兽的 DAU 早已过千万,自 ...

  8. [PHP]日志处理error_log()函数和配置使用

    1.error_log($message,$message_type,$destination,$extra_headers)函数, 2.message_type 是0,发送信息到php.ini配置的 ...

  9. [转]为什么复制构造函数的参数需要加const和引用

    [转]为什么复制构造函数的参数需要加const和引用 一.引言 1.0在解答这个问题之前,我们先跑个小程序,看下调用关系. #include <iostream> using namesp ...

  10. iOS----------学习路线思维导图

    UI相关 Runtime OC特性 内存管理 Block 多线程 Runloop 网络相关 设计模式 架构 算法 第三方库