第一种,双向链表的方式
具体处理者
public class ModelHandler {
private ModelHandler next;
private ModelHandler last;
public final ModelHandler getLast() {
return last;
}
public final void setLast(ModelHandler last) {
this.last = last;
}
public final ModelHandler getNext() {
return next;
}
public final void setNext(ModelHandler next) {
this.next = next;
}
//前置处理器
protected boolean preHandle(PoJo poJo, HttpServletRequest request, HttpServletResponse response){return true;}
public final void preHandlerRequest(PoJo poJo, HttpServletRequest request, HttpServletResponse response){
boolean handle = preHandle(poJo, request, response);
if (!handle)return;
if (next!=null){
next.preHandlerRequest(poJo,request,response);
}
}
//后置处理器
protected void afterHandle(PoJo poJo, HttpServletRequest request, HttpServletResponse response){}
public final void afterHandleRequest(PoJo poJo, HttpServletRequest request, HttpServletResponse response){
afterHandle(poJo, request, response);
if (last!=null){
last.afterHandleRequest(poJo,request,response);
}
}
执行者
public abstract class Model implements ApplicationRunner {
private ModelHandler head;//指向责任链头部的指针
private ModelHandler tail;//指向责任链尾部的指针
/**
* Description: 调用入口
* Param: [request, response]
* return: void
* Date: 2021/6/17
*/
public final void invoke(HttpServletRequest request, HttpServletResponse response){
PoJo poJo = modelPoJo(request, response);
head.preHandlerRequest(poJo,request,response);
tail.afterHandleRequest(poJo,request,response);
}
/**
* Description: 添加处理器
* Param: [modelHandler]
* return: void
* Date: 2021/6/17
*/
protected final void addHandler(ModelHandler modelHandler){
if (modelHandler==null)return;
if (head==null){
head=modelHandler;
}else{
modelHandler.setLast(tail);
tail.setNext(modelHandler);
}
tail = modelHandler;
}
protected abstract PoJo modelPoJo(HttpServletRequest request, HttpServletResponse response);
第二种,list列表的方式
处理者
public interface ModelHandler {
default boolean preHandle(PoJo poJo, HttpServletRequest request, HttpServletResponse response){
return true;
}
default void afterHandle(PoJo poJo, HttpServletRequest request, HttpServletResponse response){}
}
执行者
public abstract class Model implements ApplicationRunner {
private final List<ModelHandler> modelHandlers = new ArrayList<>();
public final void invoke(HttpServletRequest request,HttpServletResponse response){
PoJo poJo = modelPoJo(request, response);
if (poJo==null){
throw new RuntimeException("PoJo 实例化错误,请检查!");
}
preInvoke(poJo,request,response);
afterInvoke(poJo,request,response);
}
private void afterInvoke(PoJo poJo,HttpServletRequest request,HttpServletResponse response){
for (int i = modelHandlers.size()-1; i>=0 ; i--) {
modelHandlers.get(i).afterHandle(poJo,request,response);
}
}
//前置执行
private void preInvoke(PoJo poJo,HttpServletRequest request,HttpServletResponse response){
//前置执行
for (ModelHandler modelHandler : modelHandlers) {
boolean preHandle = modelHandler.preHandle(poJo, request, response);
if (!preHandle)break;
}
}
protected final void addHandle(ModelHandler handler){
if (handler!=null)
modelHandlers.add(handler);
}
protected abstract PoJo modelPoJo(HttpServletRequest request, HttpServletResponse response);
}