C#设计模式系列:职责链模式(Chain of Responsibility)
1、职责链模式简介
1.1>、定义
职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求。将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
1.2>、使用频率
中低
2、职责链模式结构
2.1>、结构图

2.2>、参与者
职责链模式参与者:
◊ Handler
° 定义一个处理请求的接口
° 实现后继链
◊ ConcreteHandler
° 处理其所负责的请求
° 可访问其后继者
° 如果可处理该请求,则处理;否则将该请求转发给它的后继者。
◊ Client:向链上的具体处理者对象提交请求
在职责链模式中,Client向Handler提交请求,请求在多个ConcreteHandler对象形成的对象链中被传递,请求在传递的过程中被处理。
3、职责链模式结构实现

Handler.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ChainOfResponsibilityPattern.Structural
{
public abstract class Handler
{
protected Handler successor; public void SetSuccessor(Handler successor)
{
this.successor = successor;
} public abstract void HandleRequest(int request);
}
}
ConcreteHandler1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ChainOfResponsibilityPattern.Structural
{
public class ConcreteHandler1 : Handler
{
public override void HandleRequest(int request)
{
if (request >= && request < )
{
Console.WriteLine("{0} handled request {1}", this.GetType().Name, request);
} else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
}
ConcreteHandler2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ChainOfResponsibilityPattern.Structural
{
public class ConcreteHandler2 : Handler
{
public override void HandleRequest(int request)
{
if (request >= && request < )
{
Console.WriteLine("{0} handled request {1}", this.GetType().Name, request);
} else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
}
ConcreteHandler3.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.ChainOfResponsibilityPattern.Structural
{
public class ConcreteHandler3 : Handler
{
public override void HandleRequest(int request)
{
if (request >= && request < )
{
Console.WriteLine("{0} handled request {1}", this.GetType().Name, request);
} else if (successor != null)
{
successor.HandleRequest(request);
}
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.ChainOfResponsibilityPattern.Structural; namespace DesignPatterns.ChainOfResponsibilityPattern
{
class Program
{
static void Main(string[] args)
{
// Setup Chain of Responsibility
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3(); h1.SetSuccessor(h2);
h2.SetSuccessor(h3); // Generate and process request
int[] requests = { , , , , , , , }; foreach (int request in requests)
{
h1.HandleRequest(request);
}
}
}
}
运行输出:
ConcreteHandler1 handled request
ConcreteHandler1 handled request
ConcreteHandler2 handled request
ConcreteHandler3 handled request
ConcreteHandler2 handled request
ConcreteHandler1 handled request
ConcreteHandler3 handled request
ConcreteHandler3 handled request
请按任意键继续. . .
上例中,ConcreteHandler1负责处理的请求范围0~10,ConcreteHandler2负责处理的请求范围10~20,ConcreteHandler3负责处理的请求范围20~30。当请求ConcreteHandler1处理不了,则让ConcreteHandler2处理,如果ConcreteHandler2处理不了,则让ConcreteHandler3处理。依次类推,Client的请求会验证职责链传递下去,直至请求被处理,而Client不要关心到底是谁处理了请求。
4、职责链模式应用分析
职责链模式适用情形:
1>、可能处理请求的对象集合以及它们在链表中的顺序是由Client根据当前应用的状态在运行时动态决定的;
2>、Client根据状态,对于不同的请求类型,可以拥有不同的可能处理请求的对象集合。一个处理请求的对象也可以根据Client的状态和请求类型,把请求传递给不同的处理对象。
3>、Client初始化请求,或者在不知道这些对象是否能处理这个请求的情况下初始化任何可能处理请求的对象。Client和在处理链表中的处理对象都不需要知道到底哪个对象去处理这个请求。
4>、请求不能保证被处理。在没有处理的情况下,请求已经到达了处理链的表尾。
职责链模式特点:
1>、职责链模式降低了发出命令的对象和处理命令的对象之间的耦合,它允许多于一个的处理者对象根据自己的逻辑来决定哪个处理者最终处理这个命令。发出命令的对象只是把命令传给链结构的起始者,而不需要知道到底是链上的哪一个节点处理了这个命令。这样在处理命令上,允许系统由更多的灵活性。哪一个对象最终处理一个命令可以由那些对象参加职责链,以及随着这些对象在职责链上的位置不同而不同。
2>、既然一个请求没有明确的接收者,那么就不能保证它一定会被处理。该请求可能一直到链的末端都得不到处理。一个请求也可以因该链没有被正确配置而得不到响应,并且处理消息传递和处理不当会出现消息的循环重复执行。
C#设计模式系列:职责链模式(Chain of Responsibility)的更多相关文章
- 设计模式之职责链模式(Chain of Responsibility)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 行为型设计模式之职责链模式(Chain of Responsibility)
结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个 ...
- 设计模式之职责链模式(Chain of Responsibility)
职责链模式原理: 职责链模式和装饰模式以及组合模式类似的地方是都维持着指向父类的指针, 不同点是职责链模式每个子类都继承父类的指针及每个之类都维持着指向父类的指针,而组合模式与装饰模式是组合类鱼装饰类 ...
- atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...
- 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...
- 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)
责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...
- 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...
- 职责链模式(Chain of Responsibility)(对象行为型)
1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- 设计模式:职责链模式(Chain of Responsibility)
去年参加校招要到长沙来,这个对于我来说不是特别喜欢(但又必须的来,谁叫咱不是985.211的娃呢),但是对于某些人来说就是福音了.大四还有课,而且学校抓的比较严,所以对于那些想翘课的人来说这个是最好不 ...
随机推荐
- Codeforces 486E LIS of Sequence 题解
题目大意: 一个序列,问其中每一个元素是否为所有最长上升子序列中的元素或是几个但不是所有最长上升子序列中的元素或一个最长上升子序列都不是. 思路: 求以每一个元素为开头和结尾的最长上升子序列长度,若两 ...
- swift-闭包(代码块)
语法 通用的语法 {(parameters) -> return type in statements } e.g let studname = { println("Welcome ...
- javaFx:使用弹出对话框 Alert
javaFx8 自带的对话框非常好用,类似的使用方式如下: /** * 弹出一个通用的确定对话框 * @param p_header 对话框的信息标题 * @param p_message 对话框的信 ...
- Data对象
var myDate = new Date(); Date()返回当日的日期 例如今天是2016/8/19 getFullYear()返回当前日期的年 myDate.getFullYear() 201 ...
- Cloud Engine:大杀器如何炼成
郑昀(微博:http://weibo.com/yunzheng) 创建于2016/6/18 最后更新于2016/6/19 点击查看我的<如何从零搭建一个技术平台>,这是一个系列.转载时请注 ...
- pip安装MySQL-python报错
pip install MySQL-pythonerror: command 'gcc' failed with exit status 1 yum install -y python-develpi ...
- [原创]MySQL innodb_rollback_on_timeout参数对锁的影响
环境:Server version: 5.6.21-log MySQL Community Server (GPL) 前提提要: innodb_rollback_on_timeout是 ...
- 浅谈数据库优化方案--表和SQL
1.数据类型的选择 1.字段最好设置为非空.若字段为char(8),即便是NULL也会现有8个字符的空间. 2.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能, ...
- Code First系列之视图,存储过程和异步API
返回<8天掌握EF的Code First开发>总目录 本篇目录 视图View 存储过程 使用存储过程CRUD 异步API 本章小结 自我测试 本系列的源码本人已托管于coding上:点击查 ...
- ABP理论学习之事件总线和领域事件
返回总目录 本篇目录 事件总线 定义事件 触发事件 处理事件 句柄注册 取消注册 在C#中,我们可以在一个类中定义自己的事件,而其他的类可以注册该事件,当某些事情发生时,可以通知到该类.这对于桌面应用 ...