設計模式-介面卡 adapter
阿新 • • 發佈:2018-12-17
來簡單實現springmvc
先來2個介面,Adapter--[關聯]--> Controller
public interface Controller { //抽象的業務方法 處理http請求和響應 並返回 ModelAndView //由不同的實現類去實現 ModelAndView handleRequest(String request, String response) throws Exception; } public interface HandlerAdapter { //檢查 public boolean supports(Object handler); //具體的處理業務方法 關聯 Controller public void handle(Controller handler); }
Controller 的不同實現
public class HttpController implements Controller { @Override public ModelAndView handleRequest(String request, String response) throws Exception { return null; } public void doHttpHandler(){ System.out.println("http..."); } } public class AnnotationController implements Controller { @Override public ModelAndView handleRequest(String request, String response) throws Exception { return null; } public void doAnnotationHandler(){ System.out.println("annotation..."); } } public class SimpleController implements Controller { @Override public ModelAndView handleRequest(String request, String response) throws Exception { return null; } public void doSimplerHandler(){ System.out.println("simple..."); } }
adapter的實現
public class HttpHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object controller) { return controller instanceof HttpController; } @Override public void handle(Controller controller) { ((HttpController) controller).doHttpHandler(); } } public class AnnotationHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object controller) { return controller instanceof AnnotationController; } /** * 傳入具體的 controller的實現 AnnotationController * * @param controller 引用佔位-實際是具體的實現類 */ @Override public void handle(Controller controller) { //技巧:強轉 ((AnnotationController) controller).doAnnotationHandler(); } } public class SimpleHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object controller) { return controller instanceof SimpleController; } @Override public void handle(Controller controller) { //強轉 ((SimpleController) controller).doSimplerHandler(); } }
DispatchServlet--[關聯]-->adapter
/**
* @desc 關聯 adapter --> List<HandlerAdapter>
*/
public class FlynnDispatchServlet {
//型別是 HandlerAdapter 介面 來注入HandlerAdapter的實現類
private List<HandlerAdapter> handlerAdapters;
public FlynnDispatchServlet() {
this.handlerAdapters = new ArrayList<>();
handlerAdapters.add(new AnnotationHandlerAdapter());
handlerAdapters.add(new HttpHandlerAdapter());
handlerAdapters.add(new SimpleHandlerAdapter());
}
void doDispatch(int type) {
Controller controller;
HandlerAdapter handlerAdapter;
//動態實現的地方
switch (type) {
case 1:
controller = new HttpController();
handlerAdapter = getHandlerFromController(controller);
break;
case 2:
controller = new AnnotationController();
handlerAdapter = getHandlerFromController(controller);
break;
default:
controller = new SimpleController();
handlerAdapter = getHandlerFromController(controller);
break;
}
if (null == handlerAdapter) {
return;
}
handlerAdapter.handle(controller);
}
private HandlerAdapter getHandlerFromController(Controller controller) {
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(controller)) {
return adapter;
}
}
return null;
}
public class AppSpringMvc {
public static void main(String[] args) {
FlynnDispatchServlet dispatchServlet = new FlynnDispatchServlet();
dispatchServlet.doDispatch(1);
dispatchServlet.doDispatch(2);
dispatchServlet.doDispatch(9);
}
}
輸出