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 >= 500000) { Console.WriteLine("正在创建:会议讨论对象..."); Console.WriteLine(">=500000的由开会讨论决定"); } else { base.ProcessRequest(aRequest); } } }
/// <summary> /// 董事长类 /// </summary> public class President : Approver { public new void ProcessRequest(PurchaseRequest aRequest) { if (aRequest.amount >= 100000 && aRequest.amount < 500000) { 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 >= 50000 && aRequest.amount < 100000) { 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 < 50000) { 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 (1 == 1) { Console.WriteLine("/r/n请输入采购项目的金额:"); PurchaseRequest aRequest = new PurchaseRequest(); aRequest.amount = Convert.ToDouble(Console.ReadLine()); Larry.ProcessRequest(aRequest); } } }