LindDotNetCore~职责链模式的应用
职责链模式
它是一种设计模块,主要将操作流程与具体操作解耦,让每个操作都可以设置自己的操作流程,这对于工作流应用是一个不错的选择!
下面是官方标准的定义:责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
职责链模式组成
- 三大对象
- 命令处理
- 处理流程
- 命令上下文
- 命令只负责组织各个流程的次序,对流程实现细节没兴趣
- 具体流程只实现自己关注的代码,对下一个流程未知
在具体代码中的体现
抽象命令
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~职责链模式的应用的更多相关文章
- JavaScript之职责链模式
一.概述 职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有 ...
- C#设计模式系列:职责链模式(Chain of Responsibility)
1.职责链模式简介 1.1>.定义 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对 ...
- php实现设计模式之 职责链模式
<?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * 抽象 ...
- Filter体现职责链模式
1. 前言 Filter—Filter 技术是servlet2.3 新增加的功能.完成的流程:对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后 ...
- Js 职责链模式 简单理解
js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...
- JAVA 设计模式 职责链模式
用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...
- 职责链模式(chain of responsibility)
一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...
- 5.js模式-职责链模式
1. 职责链模式 将对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. var chain = function(fn){ this.fn = fn; this.successor = ...
- 17. 星际争霸之php设计模式--职责链模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
随机推荐
- upload.go
package api import ( "os" "bytes" "mime/multipart" &qu ...
- election.go
package)) ].GetResponseRange().Kvs[] ) ].Value),] } wch := client.Watch(cctx, string ...
- sort.go
package clientv3 type SortTarget int type SortOrder int const ( SortNone SortOrder = iota So ...
- BZOJ_1800_[Ahoi2009]fly 飞行棋_乱搞
BZOJ_1800_[Ahoi2009]fly 飞行棋_乱搞 Description 给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列. 请找出这些点中有没有可以围成矩形的 ...
- 钉钉机器人zabbix报警
首先在钉钉群聊里添加一个自定义的机器人 并复制webhook的内容 https://oapi.dingtalk.com/robot/send?access_token=37e23308d1b84eb4 ...
- Hadoop权限管理
1.Hadoop权限管理包括以下几个模块: (1) 用户分组管理.用于按组为单位组织管理,某个用户只能向固定分组中提交作业,只能使用固定分组中配置的资源:同时可以限制每个用户提交的作业数,使用的资源量 ...
- phpstorm 下载以及安装
phpstorm都知道编写php代码比较高效,这里不多说. 关键是用它就要破解,毕竟不想花钱买,在网上找了好多方法,怎么尝试都不管用,后来我只是把版本替换为2017.1(最新版才是2017.3,版本差 ...
- 对SVN的落地与实践总结
现今最为流行的Git是管理很几套很成熟的分支管理策略.而SVN确实也有,但结合现公司的实际场景还是做了些调整和变动. 一.分支命名规则 所有分支命名采用小写字母 + 数字 + 特殊符号 组成 项目分支 ...
- asp.net core系列 52 Identity 其它关注点
一.登录分析 在使用identity身份验证登录时,在login中调用的方法是: var result = await _signInManager.PasswordSignInAsync(Input ...
- 从零单排学Redis【铂金二】
前言 只有光头才能变强 好的,今天我们要上[铂金二]了,如果还没有上铂金的,赶紧先去蹭蹭经验再回来(不然不带你上分了): 从零单排学Redis[青铜] 从零单排学Redis[白银] 从零单排学Redi ...