看到责任链模式,想到JAVA web开发中为方便对http请求进行各种处理以责任链模式实现的过滤器。
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
简单例子:
abstract class Handler {
private Handler nextHandler;
public Handler getNextHandler() {
return nextHandler;
}
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void doHandler();
}
class ConcreteHandler extends Handler {
@Override
public void doHandler() {
if (getNextHandler() != null) {
System.out.println("还有责任链");
getNextHandler().doHandler();
} else {
System.out.println("我自己处理" + toString());
}
}
}
OA流程请求例子:
abstract class ConsumeHandler {
private ConsumeHandler nextHandler;
public ConsumeHandler getNextHandler() {
return nextHandler;
}
public void setNextHandler(ConsumeHandler nextHandler) {
this.nextHandler = nextHandler;
}
/** user申请人 free报销费用 */
public abstract void doHandler(String user, double free);
}
//项目经理
class ProjectHandler extends ConsumeHandler {
@Override
public void doHandler(String user, double free) {
if (free < 500) {
if (user.equals("lwx")) {
System.out.println("给予报销:" + free);
} else {
System.out.println("报销不通过");
}
} else {
if (getNextHandler() != null) {
getNextHandler().doHandler(user, free);
}
}
}
}
//部门经理
class DeptHandler extends ConsumeHandler {
@Override
public void doHandler(String user, double free) {
if (free < 1000) {
if (user.equals("zy")) {
System.out.println("给予报销:" + free);
} else {
System.out.println("报销不通过");
}
} else {
if (getNextHandler() != null) {
getNextHandler().doHandler(user, free);
}
}
}
}
//总经理
class GeneralHandler extends ConsumeHandler {
@Override
public void doHandler(String user, double free) {
if (free >=1000) {
if (user.equals("lwxzy")) {
System.out.println("给予报销:" + free);
} else {
System.out.println("报销不通过");
}
} else {
if (getNextHandler() != null) {
getNextHandler().doHandler(user, free);
}
}
}
}
private static class VirtualFilterChain implements FilterChain {
private final FilterChain originalChain;
private final List<? extends Filter> additionalFilters;
private int currentPosition = 0;
public VirtualFilterChain(FilterChain chain, List<? extends Filter> additionalFilters) {
this.originalChain = chain;
this.additionalFilters = additionalFilters;
}
@Override
public void doFilter(final ServletRequest request, final ServletResponse response)
throws IOException, ServletException {
if (this.currentPosition == this.additionalFilters.size()) {
this.originalChain.doFilter(request, response);
}
else {
this.currentPosition++;
Filter nextFilter = this.additionalFilters.get(this.currentPosition - 1);
nextFilter.doFilter(request, response, this);
}
}
}
FilterChain 样例中,父类实现执行的策略;其他例子则是在子类中实现策略。