简介:责任链模式属于对象的行为模式。这种模式对调用者屏蔽了内部处理细节,使得提交过来的请求一次被链上节点处理,直到成功处理。这种模式下,可以随时的添加或修改处理的请求节点,对处理者的职责进行了更好的划分。
代理实现及测试如下:
/**
* 责任链父类,结构类似于链表,即类中保留了对下一个链节点的引用。
* @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 发邮箱时,有很多种不同渠道可以发送,如果一个渠道发送失败,可使用下一个渠道,直到一个渠道发送成功。