简介:责任链模式属于对象的行为模式。这种模式对调用者屏蔽了内部处理细节,使得提交过来的请求一次被链上节点处理,直到成功处理。这种模式下,可以随时的添加或修改处理的请求节点,对处理者的职责进行了更好的划分。
代理实现及测试如下:
/** * 责任链父类,结构类似于链表,即类中保留了对下一个链节点的引用。 * @author dedu * */ abstract class Handler { private Handler handler; /** * 不同的实现者实现不同,但相同点是自己无法处理时,调用下一个链节点进行处理。 * @param type 类型 */ public abstract void Handle(int type); public Handler getHandler() { return handler; } public void setHandler(Handler handler) { this.handler = handler; } } /** * Handler实现者,对范围内的type进行处理 * @author dedu * */ public class ConcreteHandler1 extends Handler{ private final int RANGE = 10; @Override public void Handle(int type) { if (type <= RANGE) { System.out.println(this.getClass().getSimpleName() + "进行处理,值为:" + type); } else { if (null != this.getHandler()) { this.getHandler().Handle(type); } } } } /** * Handler实现者,对范围内的type进行处理 * @author dedu * */ public class ConcreteHandler2 extends Handler{ private final int RANGE = 50; @Override public void Handle(int type) { if (type <= RANGE) { System.out.println(this.getClass().getSimpleName() + "进行处理,值为:" + type); } else { if (null != this.getHandler()) { this.getHandler().Handle(type); } } } } /** * Handler实现者,对范围内的type进行处理 * @author dedu * */ public class ConcreteHandler3 extends Handler{ private final int RANGE = 100; @Override public void Handle(int type) { if (type <= RANGE) { System.out.println(this.getClass().getSimpleName() + "进行处理,值为:" + type); } else { if (null != this.getHandler()) { this.getHandler().Handle(type); } } } }测试:
public static void main(String[] args) { Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); Handler handler3 = new ConcreteHandler3(); handler1.setHandler(handler2); handler2.setHandler(handler3); int[] arr = {1,2,30,49,80}; for (int i : arr) { handler1.Handle(i); } }常见使用场景: 1 请假流程处理,如老师审批、班主任审批、校长审批。 2 JavaWeb中Servlet的请求处理, Filter和FilterChain的接口。 3 发邮箱时,有很多种不同渠道可以发送,如果一个渠道发送失败,可使用下一个渠道,直到一个渠道发送成功。