责任链模式:避免请求者和接收者耦合在一起,让多个对象都有可能接受请求,这些对象通过一个链连接,沿着这条连传输请求,直到没有对象处理结束
例子,比如公司采集物品,不同金额需要不同权限的人来审批,金额小于1000部门经理审批,大于1000需财务经理审批
理解图:
还是不同对象继承一个接口,根据请求的金额决定要不要往高层的对象传递
核心的两句:
manager.nextApprover = finalcialManager;finalcialManager.nextApprover = CEO;
全部代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 责任链模式{//采购需求public sealed class PurchaseRequest{//产品总金额public double Money { get; set; }//产品名字public string ProductName { get; set; }public PurchaseRequest(double money,string name){Money = money;ProductName = name;}}public abstract class Approver{//下一个审批员public Approver nextApprover { get; set; }//当前审批员名字public string ApproverName { get; set; }public Approver(string name){ApproverName = name;}//审批请求public abstract void ProcessRequest(PurchaseRequest request);}//部门经理public sealed class Manager : Approver{public Manager(string name):base(name){}public override void ProcessRequest(PurchaseRequest request){if (request.Money <= 1000){Console.WriteLine($"{this.ApproverName}通过了{request.ProductName}的审批");}else{nextApprover.ProcessRequest(request);}}}//财务经理public sealed class FinancialManager : Approver{public FinancialManager(string name) : base(name){}public override void ProcessRequest(PurchaseRequest request){if (request.Money > 1000 && request.Money <= 10000){Console.WriteLine($"{this.ApproverName}通过了{request.ProductName}的审批");}else{nextApprover.ProcessRequest(request);}}}public sealed class CEO : Approver{public CEO(string name) : base(name){}public override void ProcessRequest(PurchaseRequest request){if (request.Money > 10000 && request.Money <= 50000){Console.WriteLine($"{this.ApproverName}通过了{request.ProductName}的审批");}else{Console.WriteLine("这个计划采购金额过大需董事会讨论决定");}}}class Program{static void Main(string[] args){PurchaseRequest purchase1 = new PurchaseRequest(3000, "显卡");PurchaseRequest purchase2 = new PurchaseRequest(15000, "办公桌");PurchaseRequest purchase3 = new PurchaseRequest(80000, "外星人电脑");Approver manager = new Manager("小李");Approver finalcialManager = new FinancialManager("张经理");Approver CEO = new CEO("陈总");manager.nextApprover = finalcialManager;finalcialManager.nextApprover = CEO;manager.ProcessRequest(purchase1);manager.ProcessRequest(purchase2);manager.ProcessRequest(purchase3);}}}
张经理通过了显卡的审批陈总通过了办公桌的审批这个计划采购金额过大需董事会讨论决定
优点:
1】、降低耦合度:职责链模式使得一个对象无需知道是其他哪一个对象处理其请求。对象仅需知道该请求会被处理即可,接受者和发送者都没有对方的明确信息,且链中的对象不需要知道链的结构,有客户端负责链的创建。
2】、可简化对象的相互连接:接受者对象仅需维持一个指向其后继者的引用,而不需维持它对所有的候选处理者的引用。
3】、增强给对象指派职责的灵活性:在给对象分派职责时,职责链可以给我们带来更多的灵活性。可以通过在运行时对该连进行动态的增加或修改处理一个请求的职责。
4】、增加新的请求处理类很方便:在系统中增加一个新的请求处理者无需修改原有系统的代码,只需要在客户端重新建链即可,从这一点看来是符合“开闭原则”的。
缺点:
1】、在找到正确的处理对象之前,所有的条件判定都要执行一遍,当责任链过长时,可能会引起性能的问题。
2】、可能导致某个请求不被处理。