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)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
随机推荐
- cordova开发跨平台应用问题随笔记
iOS下频繁请求地理位置授权 做的某个cordova应用有用到geolocation插件,跑在iOS的时候发现app请求了一次授权,结果webkit还请求了一次授权,不但如此,webkit请求的格式还 ...
- 【python】命令行输出颜色
http://www.cnblogs.com/chjbbs/p/5706513.html
- 最新Java面试题及答案整理
基础篇 一.基本功 面向对象特征 封装,继承,多态和抽象 1. 封装 封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内部的数据.在 Java 当中,有 3 种修饰 ...
- 5 JInja2模版(适用于Django和Flask)
模版 在生产环节下,我们要把后端程序(其实就是python)计算出来的数据和html页面结合起来做,这个时候模版就派上大用处了. Flask下的模版---Jinja2 Jinja是日本寺庙的意思,并且 ...
- jsch下载文件的两个注意点
1.关于sftp文件上传和下载的网上很多code,此处就不多写了.主要记录下工作中遇到的两个问题需要多注意. 1.判断sftp远程文件是否存在,通过异常捕获来判断该文件是否存在,存在返回SftpATT ...
- [原]unity3D bug记录
1.u3d 发出的xcode工程 崩溃出现这种信息 Display::DisplayLinkItem::dispatch() 到AppController.mm 修改成这样 - (void) Repa ...
- PHP缓存机制详解
一,PHP缓存机制详解 我们可以使用PHP自带的缓存机制来完成页面静态化,但是仅靠PHP自身的缓存机制并不能完美的解决页面静态化,往往需要和其他静态化技术(通常是伪静态技术)结合使用. output ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 只订阅
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 只订阅 问题 为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如 ...
- 初试WebSocket构建聊天程序
上一篇文章中使用了Ajax long polling实现了一个简单的聊天程序,对于web实时通信,今天就来试用一下基于WebSocket的长连接方式. WebSocket简介 为了增强web通信的功能 ...
- GC--垃圾收集器
把周末的文章放在现在才来写,是自己太忙了?还是堕落了? 好吧直接进入主题吧,简单干脆的理解会让自己记忆深刻: 首先说明:GC垃圾收集器关注两件事情: 第一件:查找所有存活对象. 第二件:抛弃死对象(不 ...