链条调用 , 比较优雅的就是自定义 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 ,使用的是一个数组管理了,不同于上面比较优雅的递归调用的方式,这里是统一管理的。