链条调用 , 比较优雅的就是自定义 worker 之后,可以组装不同的 chain
@Override
public final Worker handle(Worker input) throws HandlerException {
// ....
//继续处理
return successorHandle(worker);
}
private Worker successorHandle(Worker worker) {
if (next != null) {
return next.handle(worker);
}
return worker;
}
@Override
public Handler<Worker> andThen(Handler<Worker> next) {
this.next = next;
return next;
}
public class MSSQL2012HandlerChain extends StandardPreHandleChain {
public MSSQL2012HandlerChain() {
this.handleBy(new RenderHandler()).once()
.andThen(new FormatHandler()).once()
.andThen(new OrderByHandler()).once()
.andThen(new PaginationHandler()).anyTimes()
// 在分页后面额外再加一个handler处理排序问题
.andThen(new MSSQL2012OrderByHandler()).once()
.andThen(new JoinHandler()).once()
.andThen(new SubQueryHandler()).anyTimes();
}
}
业界的例子: filter 使用 pos 管理当前执行到了哪一个 filter ,使用的是一个数组管理了,不同于上面比较优雅的递归调用的方式,这里是统一管理的。