1. 程式人生 > >設計模式-介面卡 adapter

設計模式-介面卡 adapter

來簡單實現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);
    }
}

輸出