责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。责任链模式不保证每个请求都被接受,由于一个请求没有明确的接收者,那么就不能保证它一定会被处理。

优点:

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)的更多相关文章

  1. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

  2. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

  3. 23种设计模式之责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. ...

  4. 【Unity与23种设计模式】责任链模式(Chain of Responsibility)

    GoF中定义: "让一群对象都有机会来处理一项请求,以减少请求发送者与接收者之间的耦合度.将所有的接受对象串联起来,让请求沿着串接传递,直到有一个对象可以处理为止." 举个现实中的 ...

  5. [设计模式] 13 责任链模式 Chain of Responsibility

    转    http://blog.csdn.net/wuzhekai1985   http://www.jellythink.com/archives/878 向项目经理提交了休假申请,我的项目经理向 ...

  6. 设计模式 笔记 责任链模式 chain of responsibility

    //---------------------------15/04/25---------------------------- //Chain of responsibility 责任链----- ...

  7. 责任链模式-Chain of Responsibility(Java实现), 例2

    责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...

  8. 责任链模式-Chain of Responsibility(Java实现), 例1

    责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ...

  9. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

随机推荐

  1. 安卓开发笔记——WebView组件

    我们专业方向本是JAVA Web,这学期突然来了个手机App开发的课设,对于安卓这块,之前自学过一段时间,有些东西太久没用已经淡忘了 准备随笔记录些复习笔记,也当做温故知新吧~ 1.什么是WebVie ...

  2. 本文将详细介绍oracle 10g OEM常规错误

    本文将详细介绍oracle 10g OEM常规错误-------Unknown host specified解决方法,需要了解的朋友可以参考下 详细出处参考:http://www.jb51.net/a ...

  3. python操作mysql数据库实现增删改查

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: ...

  4. mysql如何优化插入记录速度

    插入记录时,影响插入速度的主要是索引.唯一性校验.一次插入记录条数等.根据这些情况,可以分别进行优化,本节将介绍优化插入记录速度的几种方法. 一.对于MyISAM引擎表常见的优化方法如下:     1 ...

  5. 利用opencv从USB摄像头获取图片

    由于opencv自带的VideoCapture函数直接从usb摄像头获取视频数据,所以用这个来作为实时的图像来源用于实体检测识别是很方便的. 1. 安装opencv 安装的步骤可以按照之前这个文章操作 ...

  6. mysql中json_extract函数的使用?作用是什么?

    需求描述: 今天看mysql中的json数据类型,涉及到一些使用,使用到了函数json_extract来 获取json字段中某个key的值,在此记录下. 操作过程: 1.查看包含json字段的表信息 ...

  7. python使用类作为装饰器

    1.普通就是一个函数作为装饰器,也可以用类名作为装饰器. 因为类和函数都是callable的,都可以使用括号来调用运行他. 2.上上篇的缓存一段时间的还是函数作为装饰器,类只是充当了比模块更下一级的命 ...

  8. 【Oracle】BLOB

    1.データベースからの読み込み Dim strSql As String = "select IMG from TBL where ID=XX" Dim cmd As New Or ...

  9. JAVA简单内存泄露分析及解决

    一.问题产生    项目采用Tomcat6.0为服务器,数据库为mysql5.1,数据库持久层为hibernate3.0,以springMVC3.0为框架,项目开发完成后,上线前夕进行稳定性拷机,测试 ...

  10. LeetCode_Maximum Subarray | Maximum Product Subarray

    Maximum Subarray 一.题目描写叙述 就是求一个数组的最大子序列 二.思路及代码 首先我们想到暴力破解 public class Solution { public int maxSub ...