23种设计模式之责任链模式(Chain of Responsibility)
责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。责任链模式不保证每个请求都被接受,由于一个请求没有明确的接收者,那么就不能保证它一定会被处理。
优点:
1)降低了耦合度。
2)增加向对象指定责任的灵活性。
3)由于在一个类中产生的事件可以被发送到组成中的其它类处理器上,类的集合可以作为一个整体。
使用场景:
1)多个对象可以处理一个请求,而其处理器却是未知的。
2)想要在不指定确切的请求接收对象的情况下,向几个对象中的一个发送请求。
3)可以动态地指定能够处理请求的对象集。
Chain of Responsibility 模式
/// <summary>
/// 副董事长类
/// </summary>
public class VicePresident : Approver
{
public new void ProcessRequest(PurchaseRequest aRequest)
if (aRequest.amount >= 50000 && aRequest.amount < 100000)
Console.WriteLine("正在创建:副董事长对象...");
Console.WriteLine("金额为:" + aRequest.amount + "的由副董事长决定");
}
else
Console.WriteLine("副董事长无权审批该采购项目,向上给董事长审批");
new President().ProcessRequest(aRequest);
/// 采购需求实体类
public class PurchaseRequest
public double amount;//一个采购的金额
public int number;//采购单编号
public string purpose;//采购目的
/// 审批类
public class Approver
public Approver()
successor = null;//初始化为null
/// 处理审批
/// <param name="aRequest">审批请求</param>
public void ProcessRequest(PurchaseRequest aRequest)
if (successor != null)
successor.ProcessRequest(aRequest);
/// 设置审批对象
/// <param name="aSuccessor">具体审批对象</param>
public void SetSuccessor(Approver aSuccessor)
successor = aSuccessor;
private Approver successor;//实例化审批对象
/// 会议讨论类
public class Congress : Approver
if (aRequest.amount >= 500000)
Console.WriteLine("正在创建:会议讨论对象...");
Console.WriteLine(">=500000的由开会讨论决定");
base.ProcessRequest(aRequest);
/// 董事长类
public class President : Approver
if (aRequest.amount >= 100000 && aRequest.amount < 500000)
Console.WriteLine("正在创建:董事长对象...");
Console.WriteLine("金额为:" + aRequest.amount + "的由董事长决定");
Console.WriteLine("董事长无权审批该采购项目,向上由会议讨论决定");
new Congress().ProcessRequest(aRequest);
/// 主任类
public class Director : Approver
if (aRequest.amount < 50000)
Console.WriteLine("正在创建:主任对象...");
Console.WriteLine("金额为:" + aRequest.amount + "的由主任决定");
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 (1 == 1)
Console.WriteLine("/r/n请输入采购项目的金额:");
PurchaseRequest aRequest = new PurchaseRequest();
aRequest.amount = Convert.ToDouble(Console.ReadLine());
Larry.ProcessRequest(aRequest);