C#设计模式之二十职责链模式(Chain of Responsibility Pattern
一、引言 2.4、模式的组成 ?? ? ??? 可以看出,在职责链模式的结构图有以下角色: ??? (1)、抽象处理者角色(Handler):抽象处理者定义了一个处理请求的接口,它一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。因为每一个处理者的下家还是一个处理者,因此在抽象处理者中定义了一个自类型的对象,作为其对下家的引用。通过该引用,处理者可以连成一条链。 ??? (2)、具体处理者角色(ConcreteHandler):具体处理者是抽象处理者的子类,它可以处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者;在具体处理者中可以访问链中下一个对象,以便请求的转发。 2.5、职责链模式的代码实现 ??? 在现实生活中,职责链模式的例子也是很多的,例如:公司的请假流程就是一个很好的职责链模式的例子,如果请假半天,只要告诉本部门经理就可以了;如果请假7天或者以上必须人事总监批准;如果请假15天以上,那就要经过总裁批准了。还有类似的例子就是采购的流程,其流程也是职责链模式很好的体现,采购的金额不同,需要批准的人员也不同,比如:部门采购1万元的纸品,只要部门领导签批就可以,如果要采购大于1万小于5万的物品,那就需要财务经理签批了,如果采购30万的原材料或者物品,那就需要总裁或者类似角色才能审批了。接下来我们就以采购的实例来说明职责链模式。实现代码如下: 1 namespace ChainOfResponsibility 2 { 3 // 采购请求 4 public sealed class PurchaseRequest 5 { 6 金额 7 double Amount { get; set; } 8 9 产品名字 10 string ProductName { 11 12 public PurchaseRequest(double amount,string productName) 13 { 14 Amount = amount; 15 ProductName = productName; 16 } 17 } 18 19 抽象审批人,Handler---相当于“抽象处理者角色” 20 abstract Approver 21 22 下一位审批人,由此形成一条链 23 public Approver NextApprover { 24 25 审批人的名称 26 string Name { 27 28 public Approver( name) 29 30 this.Name = name; 31 32 33 处理请求 34 void ProcessRequest(PurchaseRequest request); 35 36 37 部门经理----相当于“具体处理者角色” ConcreteHandler 38 Manager : Approver 39 40 public Manager(string name): base(name){ } 41 42 override ProcessRequest(PurchaseRequest request) 43 44 if (request.Amount <= 10000.0) 45 { 46 Console.WriteLine("{0} 部门经理批准了对原材料{1}的采购计划!",1)">this.Name,request.ProductName); 47 } 48 else if (NextApprover != null 49 50 NextApprover.ProcessRequest(request); 51 52 53 54 55 财务经理---相当于“具体处理者角色”ConcreteHandler 56 FinancialManager : Approver 57 58 public FinancialManager( 59 60 61 62 if (request.Amount > 10000.0 && request.Amount <= 50000.0 63 64 Console.WriteLine({0} 财务经理批准了对原材料{1}的采购计划! 65 66 67 68 69 70 71 72 73 总裁---相当于“具体处理者角色” ConcreteHandler 74 CEO :Approver 75 76 public CEO( 77 78 79 80 50000.0 && request.Amount < 300000.0 81 82 Console.WriteLine({0} 总裁批准了对原材料 {1} 的采购计划! 83 84 else 85 86 Console.WriteLine(这个采购计划的金额比较大,需要一次董事会会议讨论才能决定!"); 87 88 89 90 91 Program 92 93 static void Main([] args) 94 95 PurchaseRequest requestDao = new PurchaseRequest(8000.0,单刀5把 96 PurchaseRequest requestHuaJi = 10000.0,1)">10把方天画戟 97 PurchaseRequest requestJian = 80000.0,1)">5把金丝龙鳞闪电劈 98 99 Approver manager = new Manager(黄飞鸿100 Approver financial = new FinancialManager(黄麒英101 Approver ceo = new CEO(十三姨102 103 设置职责链 104 manager.NextApprover = financial; 105 financial.NextApprover = ceo; 106 107 处理请求 108 manager.ProcessRequest(requestDao); 109 manager.ProcessRequest(requestHuaJi); 110 manager.ProcessRequest(requestJian); 111 112 Console.ReadLine(); 113 114 115 } ?? 模式的代码如上,很简单,备注很清楚,慢慢品味一下就知道其中道理了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |