23种设计模式之责任链模式(Chain of Responsibility)
责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。责任链模式不保证每个请求都被接受,由于一个请求没有明确的接收者,那么就不能保证它一定会被处理。
优点:
1)降低了耦合度。
2)增加向对象指定责任的灵活性。
3)由于在一个类中产生的事件可以被发送到组成中的其它类处理器上,类的集合可以作为一个整体。
使用场景:
1)多个对象可以处理一个请求,而其处理器却是未知的。
2)想要在不指定确切的请求接收对象的情况下,向几个对象中的一个发送请求。
3)可以动态地指定能够处理请求的对象集。

Chain of Responsibility 模式
/// <summary>
/// 采购需求实体类
/// </summary>
public class PurchaseRequest
{
public double amount;//一个采购的金额
public int number;//采购单编号
public string purpose;//采购目的
}
/// <summary>
/// 审批类
/// </summary>
public class Approver
{
public Approver()
{
successor = null;//初始化为null
} /// <summary>
/// 处理审批
/// </summary>
/// <param name="aRequest">审批请求</param>
public void ProcessRequest(PurchaseRequest aRequest)
{
if (successor != null)
{
successor.ProcessRequest(aRequest);
}
} /// <summary>
/// 设置审批对象
/// </summary>
/// <param name="aSuccessor">具体审批对象</param>
public void SetSuccessor(Approver aSuccessor)
{
successor = aSuccessor;
} private Approver successor;//实例化审批对象
}
/// <summary>
/// 会议讨论类
/// </summary>
public class Congress : Approver
{
public void ProcessRequest(PurchaseRequest aRequest)
{
if (aRequest.amount >= )
{
Console.WriteLine("正在创建:会议讨论对象...");
Console.WriteLine(">=500000的由开会讨论决定");
}
else
{
base.ProcessRequest(aRequest);
}
}
}
/// <summary>
/// 董事长类
/// </summary>
public class President : Approver
{
public new void ProcessRequest(PurchaseRequest aRequest)
{
if (aRequest.amount >= && aRequest.amount < )
{
Console.WriteLine("正在创建:董事长对象...");
Console.WriteLine("金额为:" + aRequest.amount + "的由董事长决定");
}
else
{
Console.WriteLine("董事长无权审批该采购项目,向上由会议讨论决定");
new Congress().ProcessRequest(aRequest);
}
}
}
/// <summary>
/// 副董事长类
/// </summary>
public class VicePresident : Approver
{
public new void ProcessRequest(PurchaseRequest aRequest)
{
if (aRequest.amount >= && aRequest.amount < )
{
Console.WriteLine("正在创建:副董事长对象...");
Console.WriteLine("金额为:" + aRequest.amount + "的由副董事长决定");
}
else
{
Console.WriteLine("副董事长无权审批该采购项目,向上给董事长审批");
new President().ProcessRequest(aRequest);
}
}
}
/// <summary>
/// 主任类
/// </summary>
public class Director : Approver
{
public new void ProcessRequest(PurchaseRequest aRequest)
{
if (aRequest.amount < )
{
Console.WriteLine("正在创建:主任对象...");
Console.WriteLine("金额为:" + aRequest.amount + "的由主任决定");
}
else
{
Console.WriteLine("主任无权审批该采购项目,向上给副董事长审批");
new VicePresident().ProcessRequest(aRequest);
}
}
}
class Program
{
static void Main(string[] args)
{
//责任链设计模式
Congress Meeting = new Congress();
President Tammy = new President();
VicePresident Sam = new VicePresident();
Director Larry = new Director(); //构造责任链
Meeting.SetSuccessor(null);
Tammy.SetSuccessor(Meeting);
Sam.SetSuccessor(Tammy);
Larry.SetSuccessor(Sam); while ( == )
{
Console.WriteLine("/r/n请输入采购项目的金额:");
PurchaseRequest aRequest = new PurchaseRequest();
aRequest.amount = Convert.ToDouble(Console.ReadLine());
Larry.ProcessRequest(aRequest);
}
}
}

23种设计模式之责任链模式(Chain of Responsibility)的更多相关文章
- 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)
		责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ... 
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
		原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ... 
- 23种设计模式之责任链模式(Chain of Responsibility Pattern)
		责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. ... 
- 【Unity与23种设计模式】责任链模式(Chain of Responsibility)
		GoF中定义: "让一群对象都有机会来处理一项请求,以减少请求发送者与接收者之间的耦合度.将所有的接受对象串联起来,让请求沿着串接传递,直到有一个对象可以处理为止." 举个现实中的 ... 
- [设计模式] 13 责任链模式 Chain of Responsibility
		转 http://blog.csdn.net/wuzhekai1985 http://www.jellythink.com/archives/878 向项目经理提交了休假申请,我的项目经理向 ... 
- 设计模式 笔记 责任链模式 chain of responsibility
		//---------------------------15/04/25---------------------------- //Chain of responsibility 责任链----- ... 
- 责任链模式-Chain of Responsibility(Java实现), 例2
		责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ... 
- 责任链模式-Chain of Responsibility(Java实现), 例1
		责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ... 
- 《JAVA设计模式》之责任链模式(Chain of Responsibility)
		在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ... 
随机推荐
- [ROM]HTC ThunderBolt 4.0.4 刷机教程
			Z大原帖:http://www.in189.com/thread-754076-1-1.html 精简版:http://www.in189.com/thread-807796-1-1.html 下载地 ... 
- XML 中可嵌入 cmd命令脚本
			原文要参照代码 1. XML解析 Task逻辑块可相互组合,形成复杂的树状结构,其结构用XML表示,即写成XML文件的形式. 样例如下: <!-- 顺序执行块 --> <seq> ... 
- 编写高质量代码_改善C++程序的150个建议 读书笔记
			这几天看了下这本书<编写高质量代码_改善C++程序的150个建议>,觉的蛮有收获的,再次记录下自己以前不清晰的知识点,以供学习. 编写符合标准的main函数 C语言标准规定了main函数的 ... 
- 127使用 TableView 自带的单元格样式实现好友列表,另外在单元格中添加辅助按钮
			类似的做法如之前这篇随笔:114自定义UITableViewCell(扩展知识:为UITableViewCell添加动画效果) 相比之下:自定义 UITableViewCell 的内容灵活,可根据需求 ... 
- sql server 2005 怎么看是不是企业版
			已经安装了SQL server 2005 怎么确定它是企业版 还是标准版??? 执行sql:SELECT @@VERSION在结果里看,比如我这里是(里面有Enterprise Edition,表示企 ... 
- JSP转发和重定向的区别
			重定向: response.sendRedirect("地址"); a. 页面地址显示最终页面 b. 不可向后传递参数 c. 跳到外 ... 
- rpc框架 SimpleXMLRP
			一台电脑去控制另一台电脑干事情,最常见的就是web. 用户get/post一个url,服务端根据url地址和参数去做相应的事情把结果返回给客户端. server.py #coding=utf8 fro ... 
- iOS开发 frame 与 bounds 的区别与关系 转自隔叶黄莺
			frame和bounds是UIView中的两个属性(property). frame指的是:该view在父view坐标系统中的位置和大小.(参照点是父亲的坐标系统) bounds指的是:该view在本 ... 
- iOS去掉icon的(自带磨光效果)gloss effects
			只需两步,第一步:在项目的plist文件,最上层add row ,内容 icon already includes gloss effects YES. 第二步在 icon files 字段里添加 ... 
- MyBatis入门程序之整合Spring
			1.引入相关jar包(版本对应关系3.3.1版本的mybatis和1.1.1的spring-mybatis匹配,3.4.1版本的mybatis和1.3.1的spring-mybatis匹配) 如果不对 ... 
