阅读量:0
特别感谢刘伟老师,看他的书我学到了很多东西,从今天开始我要开始更新啦!
在csdn个人博客来总结知识,把他们变成自己的能力。
对三,要不起,张三李四王五几个人在玩斗地主,过过过,一张2 ,其他的都要不起,出了一张4,下家管上。 ---------举个小例子
职责链模式常用于工作流,例如审批单场景,小于五百,管理员审批,大于五百小于3000主管审批,再高些就要老板审批了。
根据此,对应的设计模式就是职责链模式。就是抽象化一个上帝视角的抽象类,由他去判断过不过能不能管上。
上面的是思路,下面就
应用场景:
职责链模式通过建立一条链来组织请求的处理者。 请求将沿着链进行传递,请求发送者无须知道请求在何时、何处以及如何被处理,实现了请求发送者与处理者的解耦。 在软件开发中,如果遇到有多个对象可以处理同一请求时可以应用职责链模式。
是具体的代码实现。大家可以粘贴到本地自己运行的。
1.实体类定义了公共信息
public class PurchaseRequest { private double amount; // 采购金额 private int number; // 采购编号 private String purposr;// 采购目的 public PurchaseRequest(double amount, int number, String purposr) { this.amount = amount; this.number = number; this.purposr = purposr; } public double getAmount() { return amount; } public void setAmount(double amount) { this.amount = amount; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public String getPurposr() { return purposr; } public void setPurposr(String purposr) { this.purposr = purposr; } }
2.上帝抽象类
这儿我要解释下,protected可以让继承的子类使用,当前的名字,同时也设置了后继者(下一个节点)的操作人信息,每个人都有自己的抽象处理方法(私有化)
abstract class Approver { protected Approver successor; // 定义后继对象 protected String name; //审批者姓名 public Approver(String name) { this.name = name; } // 设置后继者 public void setSuccessor(Approver successor){ this.successor = successor; }; // 抽象请求处理方法 public abstract void processRequest(PurchaseRequest request); }
3.角色类
public class Congress extends Approver{ public Congress (String name){ super(name); } @Override public void processRequest(PurchaseRequest request) { if (request.getAmount() < 100000){ System.out.println("副董事长:"+this.name +"申购采批单:"+request.getNumber()+"余额"+request.getAmount()+"元,采购目的:" +request.getPurposr()+"。" ); }else { this.successor.processRequest(request); // 转发请求 } } }
public class Director extends Approver{ public Director (String name){ super(name); } @Override public void processRequest(PurchaseRequest request) { if (request.getAmount() < 50000){ System.out.println("主任:"+this.name +"申购采批单:"+request.getNumber()+"余额"+request.getAmount()+"元,采购目的:" +request.getPurposr()+"。" ); }else { this.successor.processRequest(request); // 转发请求 } } }
public class President extends Approver{ public President(String name) { super(name); } @Override public void processRequest(PurchaseRequest request) { if (request.getAmount() < 500000){ System.out.println("董事长:"+this.name +"申购采批单:"+request.getNumber()+"余额"+request.getAmount()+"元,采购目的:" +request.getPurposr()+"。" ); }else { System.out.println("超过天际了不允许审批");; // 转发请求 } } }
最后的是启动类,符合开闭原则,新增功能节点,不需要修改其他的代码:只需要在职责链路指定下一个节点即可,需要注意的是,最终节点需要写补偿方案
public class test { public static void main(String[] args) { Approver wjzhang,gyang,jguo; wjzhang = new Director("张无忌"); // 主任 jguo = new Congress("郭靖"); // 副董事长 gyang = new President("杨过"); // 董事长 // 创建职责链路 wjzhang.setSuccessor(jguo); jguo.setSuccessor(gyang); // 创建采购单 PurchaseRequest pr1 = new PurchaseRequest(45000,10001,"倚天屠龙剑"); wjzhang.processRequest(pr1); PurchaseRequest pr2 = new PurchaseRequest(60000,10002,"购买屠龙刀"); wjzhang.processRequest(pr2); PurchaseRequest pr3 = new PurchaseRequest(160000,10003,"购买九阳真经"); wjzhang.processRequest(pr3); PurchaseRequest pr4 = new PurchaseRequest(800000,10004,"购买桃花岛"); wjzhang.processRequest(pr4); } }
最后的结果如下: