设计模式C#实现(十四)——责任链模式
意图
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
适用性
在以下条件下使用:
- 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
- 你想在不明确指定接受者的情况下,向多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应该被动态指定。
结构
实现
实现一个邮件处理系统,将邮件按照类别交给不同的对象处理。
已经分类的邮件
public class Request
{
public Request(string type)
{
Type = type;
}
private string _content;
public string Type { get; set; }
}
处理的抽象,类似链表,自身包含指向下一个处理节点的对象
public abstract class Handler
{
protected Handler _nextHandler;
public abstract void ProcessRequest(Request request);
public void SetNext(Handler handler)
{
_nextHandler = handler;
}
}
对不同类型进行处理的对象
//粉丝邮件处理
public class FanHandler:Handler
{
public override void ProcessRequest(Request request)
{
if (request.Type=="fan")
{
Console.WriteLine("fan's email process");
}
else
{
_nextHandler.ProcessRequest(request);
}
}
}
//垃圾邮件处理
public class SpamHandler : Handler
{
public override void ProcessRequest(Request request)
{
if (request.Type == "spam")
{
Console.WriteLine("spam delete");
}
else
{
_nextHandler.ProcessRequest(request);
}
}
}
//抱怨和意见邮件处理
public class ComplaintHandler:Handler
{
public override void ProcessRequest(Request request)
{
if (request.Type=="complaint")
{
Console.WriteLine("complaint process");
}
else
{
_nextHandler.ProcessRequest(request);
}
}
}
//其他邮件处理
public class DefaultHandler:Handler
{
public override void ProcessRequest(Request request)
{
Console.WriteLine("Do some thing!");
}
}
使用之前,先要将责任链串联起来
class Program
{
static void Main(string[] args)
{
//发送者
var fan = new Request("fan");
var spam = new Request("spam");
var complaint = new Request("complaint");
var other = new Request("other");
//接受者
var fanHandler = new FanHandler();
var spamHandler = new SpamHandler();
var complaintHandler = new ComplaintHandler();
var defaultHandler = new DefaultHandler();
//构造责任链
fanHandler.SetNext(spamHandler);
spamHandler.SetNext(complaintHandler);
complaintHandler.SetNext(defaultHandler);
//请求交由责任链头节点处理
fanHandler.ProcessRequest(fan);
fanHandler.ProcessRequest(spam);
fanHandler.ProcessRequest(complaint);
fanHandler.ProcessRequest(other);
Console.ReadKey();
}
}
运行结果
效果
- 降低耦合度
- 增强了给对象指派职责的灵活性
- 不保证被接受(用一个默认处理类来解决这个问题)
参考
设计模式C#实现(十四)——责任链模式的更多相关文章
- 设计模式之二十:责任链模式(Chain of Responsibility)
感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有 ...
- Java 设计模式系列(十四)命令模式(Command)
Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...
- Java设计模式十九——责任链模式
责任链模式 老李的苦恼 每个人在出生的时候,都早已在暗中被标好了三六九等. 老李是一名建筑工地的木匠,和大多数生活在社会最底层的农民工一样,一辈子老实本分,胆小怕事.在他们的心中,谁当老爷都没有区别, ...
- java23种设计模式之十:责任链模式
最近在学习netty中发现其中用到了责任链模式,然后结合自己在写代码中遇到了大量写if...else的情况,决定学习一下责任链模式. 一.什么样的场景下会选择用责任链模式 我们在进行业务逻辑判断时,需 ...
- 设计模式(C#)——12责任链模式
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 前言 在开发游戏过程中,当玩家合成一种道具的时候,对于不痛的道具,需要的碎片个数,类型是不同的.用传统的写法,就是 ...
- python 设计模式之 (Chain of Responsibility)责任链模式
#写在前面 对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的.所以弄明白很重要. 等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场 #责任链模式定义 简书上一网友就把这个定义 ...
- iOS设计模式解析(五)责任链模式
责任链模式:使多个对象都有机会处理请求,从而避免发送者和接受者之间发生耦合. 应用场景: 有多个对象可以处理请求,而处理程序只有在运行时才能确定 例如: 英雄联盟中伤害计算,伤害类型分为AP.AD.真 ...
- 设计模式(13)--Chain of Responsibility(责任链模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...
- 【设计模式】行为型05责任链模式(Chain of responsibility Pattern)
学习地址:http://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html demo采用了DEBUG级别举例子,理解起 ...
- java设计模式8.迭代子模式、责任链模式、命令模式
迭代子模式 迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象.它将迭代逻辑封装到一个独立的迭代子对象中,从而与聚集本身分开.迭代子对象是对遍历的抽象化,不同的聚集对象可以提供相同的迭代 ...
随机推荐
- CSS表格溢出省略号代替及其他标签
box-shadow: 20px 20px 55px #777; // div阴影效果 filter:alpha(opacity=60) //设置透明度为60 opacity:0.6 //非IE浏览器 ...
- C中的fseek函数使用
函数名:fseek函数 头文件:#include<stdio.h> 功能:把与fp有关的文件位置指针放到一个指定位置. 格式: int fseek(FILE *stream, long ...
- [Java 安全]加密算法
Base64编码 算法简述 定义 Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别. Base64是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的A ...
- 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续3篇-导出时动态生成多Sheet EXCEL)
ExcelUtility 类库经过我(梦在旅途)近期不断的优化与新增功能,现已基本趋向稳定,功能上也基本可以满足绝大部份的EXCEL导出需求,该类库已在我们公司大型ERP系统全面使用,效果不错,今天应 ...
- 【吐槽】gist.github.com疑遭中间人攻击
北京时间201510081004,云南电信用户,现在上https://gist.github.com/,用IE10会提示证书被伪造,用搜狗4.1.3.9668会跳转到[http://www.cjb.n ...
- 又一个半成品库 weblog rpc client
我基本上属于半成品专业户,去看我的github就知道. 下午又撸了一个weblog rpc client库,而这又一次证明了一个有技术但没有产品能力的程序员是没有卵用的. 因为当做好了库的雏形,但与具 ...
- Java--Callable与返回值future
package com; import java.util.concurrent.*; /** * Created by yangyu on 16/11/28. */ /** * Callable a ...
- RequireJS入门之二——第二例(写自己的模块)
第一节遗留的问题: 中文乱码: 修改require.js文件,搜索charset 关键字,修改为GBK:(貌似乱不乱码和jquery版本有问题,切换GBK和utf-8!!) 路 径: 仅 ...
- DrawSVG - SVG 路径动画 jQuery 插件
jQuery DrawSVG 使用了 jQuery 内置的动画引擎实现 SVG 路径动画,用到了 stroke-dasharray 和 stroke-dashoffset 属性.DrawSVG 是完全 ...
- TouchPoint.js – 可视化展示 HTML 原型点击效果
TouchPoint.js 是一个用于 HTML 原型展示的 JavaScript 库(作为UX过程的一部分),通过视觉表现用户在屏幕上的点击.TouchPoint 是高度可定制,非常适合屏幕录制,用 ...