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)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
随机推荐
- Objective-C语法之指针型参数
main.m #import <Foundation/Foundation.h> /** * 测试指针型参数和普通参数的区别 * * @param a 指针型参数 * @param b 普 ...
- SOCKET,TCP/IP,UDP,HTTP,FTP总结
一.TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组(主要解决数据如何在网络中传输),可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议 ...
- virtualbox谨记:win7上只有4.3.x的版本支持ubuntu14.04.3虚拟机安装Oracle Rac,其他的版本3.x和5.0.2(至2015-08-30)均不可以
virtualbox谨记:win7上只有4.3.x的版本支持ubuntu14.04.3虚拟机安装Oracle Rac,其他的版本3.x和5.0.2(至2015-08-30)均不可以
- Lua点号和冒号区别
定义的时候冒号默认接收self参数调用的时候冒号默认传递调用者自己为参数而句号要显示传递或接收self参数 -- 例如:句号定义,需要显示传递或接收 a = { x = } function a.fu ...
- 怎么安装ABBYY FineReader
ABBYY FineReader是市场领先的文字识别(OCR)软件,可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索信息,ABBYY FineReader 12是目前最新版本 ...
- VS2010安装包制作全过程图解
项目的第一个版本出来了,要做个安装包,很久没做过已经有些淡忘了,网上差了差资料,写了一个,总结下,可能还不是很完善,仅作参考. 1.首先在打开 VS2010 >新建>项目 2.创建一 ...
- extjs 分组函数自定义统计
//获取统计信息函数 Ext.getStatText = function (values) { var zy = 0; var tm = 0; for (var i = 0; i < valu ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 静态服务
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 静态服务 有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管 ...
- 【安全开发】PHP安全编码规范
申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...
- 【DVWA】Web漏洞实战之File Upload
File Upload File Upload,即文件上传漏洞,一般的上传漏洞可能是未验证上传后缀 或者是验证上传后缀被bypass 或者是上传的文件验证了上传后缀但是文件名不重命名. LOW 直接上 ...