C#设计模式:责任链模式
设计模式是面向对象编程的基础,是用于指导程序设计。在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式。应该根据具体需求和要求应用适合的设计模式。设计模式是一个老话题了,因为最近在设计“网关API”组件(后续介绍),采用“责任链设计模式”进行设计,所以先进行回顾记录。
一、责任链模式介绍
责任链模式是指一个处理需要涉及多个过程或者角色参与处理,并基于某个约定组成一个链,每个过程或者角色拥有各自职责进行处理。责任链模式有效组织一个过程处理,同时子过程之间职责明确。在.NET平台中很常见此模式应用。例如管道方式就可以采用责任链模式进行设计实现。
二、责任链模式结构图
如下图所示,此类图就是责任链模式核心的结构图,常见定义一个接口各子过程基础此接口实现,通过接口进行解耦子过程之间依赖。
三、责任链模式实现
通过如下简单DEMO进行展示责任链的实现。定义一个接口(Ihandler)、三个实现类(AHandler、BHandler、CHandler)和一个上下文类(PipelContext)。
public interface IHandler
{
PipelContext DoAction(PipelContext pipelContext);
}
public class AHandler : IHandler
{
private IHandler NextHandler { get; set; } public AHandler(IHandler nextHandler)
{
NextHandler = nextHandler;
} public PipelContext DoAction(PipelContext pipelContext)
{
bool isNext = (pipelContext.Flag < ) ? true : false;
pipelContext.request = "AA";
Console.WriteLine("my is " + pipelContext.request); if (NextHandler != null && isNext)
{
NextHandler.DoAction(pipelContext);
}
return pipelContext;
}
} public class BHandler : IHandler
{
private IHandler NextHandler { get; set; } public BHandler(IHandler nextHandler)
{
NextHandler = nextHandler;
} public PipelContext DoAction(PipelContext pipelContext)
{
bool isNext = (pipelContext.Flag < ) ? true : false;
pipelContext.request = "BB";
Console.WriteLine("my is " + pipelContext.request); if (NextHandler != null && isNext)
{
NextHandler.DoAction(pipelContext);
} return pipelContext;
}
} public class CHandler : IHandler
{
private IHandler NextHandler { get; set; } public CHandler(IHandler nextHandler)
{
NextHandler = nextHandler;
} public PipelContext DoAction(PipelContext pipelContext)
{
bool isNext = (pipelContext.Flag < ) ? true : false;
pipelContext.request = "CC";
Console.WriteLine("my is " + pipelContext.request); if (NextHandler != null && isNext)
{
NextHandler.DoAction(pipelContext);
}
return pipelContext;
}
}
public class PipelContext
{
public PipelContext()
{
Key = Guid.NewGuid();
} public Guid Key { get; set; } public int Flag { get; set; } public string request { get; set; } public string respone { get; set; }
}
static void Main(string[] args)
{
IHandler ModuleC = new CHandler(null);
IHandler ModuleB = new BHandler(ModuleC);
IHandler ModuleA = new AHandler(ModuleB); PipelContext p = new PipelContext();
while (true)
{
p.Flag = Convert.ToInt32(Console.ReadLine());
ModuleA.DoAction(p);
}
}
四、总结
上述只是一个很简单的责任链模式,实际应用中根据需求,子过程可以采用可配置方式实现热插拔式,提升灵活、扩展及可维护。
出处:http://www.cnblogs.com/Andon_liu
关于作者:专注于微软平台项目架构、管理。熟悉设计模式、领域驱动、架构设计、敏捷开发和项目管理。现主要从事ASP.NET MVC、WCF/Web API、SOA、MSSQL、redis方面的项目开发、架构、管理工作。
如有问题或建议,请一起学习讨论!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
如有问题,可以邮件:568773262@qq.com 联系我,谢谢。
C#设计模式:责任链模式的更多相关文章
- java 设计模式 -- 责任链模式
设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...
- 浅谈Python设计模式 -- 责任链模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本 ...
- 【设计模式】Java设计模式 - 责任链模式
[设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...
- 我的Java设计模式-责任链模式
今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...
- Java设计模式-责任链模式
提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...
- Java与设计模式-责任链模式
责任链模式属于行为型设计模式之中的一个,怎么理解责任链?责任链是能够理解成数个对象首尾连接而成,每个节点就是一个对象.每个对象相应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模 ...
- php设计模式-责任链模式
责任链模式更像是一种简化多种场景下调用处理的一种设计模式,特别适合if-else分支判断很多的场景.比如是根据不同会员等级给予不同的优惠力度. 它的定义:对象的调用是由下家的应用连接起来的处理链.一直 ...
- C#设计模式-责任链模式(Chain of Responsibility Pattern)
引子 一个事件需要经过多个对象处理是一个挺常见的场景,譬如采购审批流程,请假流程,软件开发中的异常处理流程,web请求处理流程等各种各样的流程,可以考虑使用责任链模式来实现.现在以请假流程为例,一般公 ...
- php 23种设计模式 - 责任链模式
责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行 ...
- 23种设计模式--责任链模式-Chain of Responsibility Pattern
一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...
随机推荐
- 前端项目经验总结之js防缓存(避免缓存的影响)
一.问题描述:打包后的h5项目中有个server.js文件夹,这个文件夹有些时候用户更新了h5,但是加载的还是旧的server.js,所以怀疑是缓存的问题,为了避免缓存的影响所以要给server.js ...
- [Hadoop] - Cannot run program "cmake"
在编译hadoop的过程中,遇到缺少cmake命令的异常,异常信息为:Cannot run program "cmake" (in directory "/opt/wor ...
- 基于vue2.0+vuex+localStorage开发的本地记事本
本文采用vue2.0+vuex+localStorage+sass+webpack,实现一个本地存储的记事本.兼容PC端和移动端.在线预览地址:DEMO github地址:https://github ...
- vpn安装
尾戒0717 centos 6.5 openvpn 安装 安装环境: 系统:centos 6.5 openvpn:openvpn-2.2.1 lzo:lzo-2.09 下载地址:http:/ ...
- Java和C++的对比
事实上, Java 本来就是从 C++衍生出来的. C++和 Java 之间仍存在一些显著的差异.可以这样说,这些差异代表着技术的极大进步.一旦我们弄清楚了这些差异,就会理解为什么说 Java 是一种 ...
- 用DotRas来连接VPN网络
最近要用程序来不断的连接VPN(为什么要这样就不讨论了),开始用的是如下代码: public static bool ADSL() { bool flag = true; do { Console.W ...
- Ansible 系列之 Playbooks 剧本 (1)
一.Playbooks 介绍 1.Playbooks是Ansible的配置,部署和编排语言.它们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤. 如果说ansible 模块 是你车间里的 ...
- 利用CSS3 animation绘制动态卡通人物,无需使用JS代码
此外博主原创,转载请注明出处:谢谢~ 效果图: 其中云.风车.尾巴是动态的: 以下是代码: <!DOCTYPE html> <html lang="en"> ...
- javascript作用域和闭包之我见
javascript作用域和闭包之我见 看了<你不知道的JavaScript(上卷)>的第一部分--作用域和闭包,感受颇深,遂写一篇读书笔记加深印象.路过的大牛欢迎指点,对这方面不懂的同学 ...
- Codeblocks快捷键
Codeblocks快捷键: Ctrl+Shift+Enter:复制控制台exe内容 Ctrl+Z:撤销 Ctrl+F:查找 Ctrl+R:查找替换功能 Ctrl+Shift+C:加注释 C ...