责任链模式
基本理论
责任链模式允许请求沿着处理链进行传递,链中的每个处理者都要决定是自己处理,还是交给下一环处理
在这里有一个很经典的案例就是请假审批,比如我们有这样一个需求,就是当员工请假时,审批规则如下:
- 请假天数少于3天,组长审批
- 请假天数在3-5天,主管审批
- 请求天数大于5天,经理审批
此时就可以使用责任链模式来编写这个代码,这种设计模式有三个核心角色:
- 抽象处理者:通常包含一个指向下一个处理者的引用和一个处理方法的声明
- 具体处理者:指定下一个处理者是谁,并且要实现处理的方法
- 客户端:创建处理者对象并组成责任链的结构,负责将请求发送给第一个处理者

测试代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| package com.jzo2o.orders.dispatch.test;
public class ApproveTest { public static void main(String[] args) { Handler handler = new JingLiHandler(new ZhuGuangHandler(new ZuZhangHandler(null))); handler.approve(3); handler.approve(5); handler.approve(7); }
}
abstract class Handler { Handler next;
public Handler(Handler handler) { this.next = handler; }
public abstract void approve(int days); }
class ZuZhangHandler extends Handler { public ZuZhangHandler(Handler handler) { super(handler); }
@Override public void approve(int days) { if (days <= 3) { System.out.println("组长审批,允许请假"); } else { next.approve(days); } } }
class ZhuGuangHandler extends Handler { public ZhuGuangHandler(Handler handler) { super(handler); }
@Override public void approve(int days) { if (days > 3 && days <= 5) { System.out.println("主管审批,允许请假"); } else { next.approve(days); } } }
class JingLiHandler extends Handler { public JingLiHandler(Handler handler) { super(handler); }
@Override public void approve(int days) { if (days > 5) { System.out.println("经理审批,允许请假"); } else { next.approve(days); } } }
|