適配器模式在springMVC的應用
通過 設計模式之適配器模式一文我們瞭解了適配器的三種模式以及它的簡單實現,本文將簡化springMVC的流程來講述適配器模式的控制器轉發實現。
用過springMVC的同志都知道,它的核心代碼在於DispatcherServlet類中的doDispatch方法,該方法完成的功能是會根據傳入的Controller類型執行相應的方法返回modelView對象。
現在假設我們在第一時間實現這個需求,大多數的程序員會這樣實現:
if(mappedHandler.getHandler() instanceof MultiActionController){
((MultiActionController)mappedHandler.getHandler()).xxx
}else if(mappedHandler.getHandler() instanceof XXX){
...
}else if(...){
...
}
這樣在代碼中出現了大量的if-else邏輯,如果再加一種controller類型就需要修改源碼維護成本太高,拓展性幾乎沒有。因此這種實現方式肯定不可取。spring團隊作爲大神級別的存在自然不會用這麼low的實現方式。那他們是如何實現的呢?
答案是適配器模式,更具體的是對象的適配器模式。下面我就用代碼簡單的模擬下它的實現邏輯。
定義一個Controller接口
public interface Controller {
}
該接口什麼都不幹,只是一個標記接口。
定義一個Adapter接口
package com.zte.service.test;
public interface HandlerAdapter {
public boolean supports(Controller handler);
public void handle(Controller handler);
}
supports方法根據傳入的controller類型返回是否匹配本實現類。
handle方法處理具體的業務處理邏輯。
定義兩個不同的controller實現類
@service
public class HttpHandlerAdapter implements HandlerAdapter {
public void handle(Object handler) {
((HttpController)handler).doHttpHandler();
}
public boolean supports(Object handler) {
return (handler instanceof HttpController);
}
}
@service
public void handle(Object handler) {
((AnnotationController)handler).doAnnotationHandler();
}
public boolean supports(Object handler) {
return (handler instanceof AnnotationController);
}
模擬一個DispatcherServlet
package com.zte.service.test;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DispatchServlet {
@Resource
public List<HandlerAdapter> handlerAdapters;
@RequestMapping("test")
public void doDispatch(){
//此處模擬SpringMVC從request取handler的對象,僅僅new出,可以出,
//不論實現何種Controller,適配器總能經過適配以後得到想要的結果
// HttpController controller = new HttpController();
// AnnotationController controller = new AnnotationController();
SimpleController controller = new SimpleController();
//得到對應適配器
HandlerAdapter adapter = getHandler(controller);
//通過適配器執行對應的controller對應方法
adapter.handle(controller);
}
public HandlerAdapter getHandler(Controller controller){
for(HandlerAdapter adapter: this.handlerAdapters){
if(adapter.supports(controller)){
return adapter;
}
}
return null;
}
}
至此一個簡單的springmvc轉發中心模擬完畢。本文僅僅爲了簡介下適配器的簡單應用和實際的代碼實現有很大的區別,請勿當初springmvc的實現原理。