zoukankan      html  css  js  c++  java
  • SpringMVC中的适配器(适配者模式)

    此处采用了适配器模式, 由于Controller的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要在代码中写成如下形式: 

    Java代码  收藏代码
    if(mappedHandler.getHandler() instanceof MultiActionController){  
       ((MultiActionController)mappedHandler.getHandler()).xxx  
    }else if(mappedHandler.getHandler() instanceof XXX){  
        ...  
    }else if(...){  
       ...  
    }  


    这样假设如果我们增加一个HardController,就要在代码中加入一行 if(mappedHandler.getHandler() instanceof  HardController) 
    这种形式就使得程序难以维护,也违反了设计模式中的开闭原则 --  对扩展开放,对修改关闭。 

    因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类, 
    让适配器代替controller执行相应的方法。这样在扩展Controller 时,只需要增加一个适配器类就完成了SpringMVC的扩展了,真的是很精巧的做法! 

    废话不多说还是上代码吧,为了看得清楚,就自己实现一套代码来模拟springMVC, 直接贴Spring源码容易降低关注点。 

    Java代码  收藏代码
    //定义一个Adapter接口  
    public interface HandlerAdapter {  
        public boolean supports(Object handler);  
        public void handle(Object handler);  
    }  
      
    //以下是三种Controller实现  
    public interface Controller {  
      
    }  
      
    public class HttpController implements Controller{  
        public void doHttpHandler(){  
            System.out.println("http...");  
        }  
    }  
      
    public class SimpleController implements Controller{  
        public void doSimplerHandler(){  
            System.out.println("simple...");  
        }  
    }  
      
    public class AnnotationController implements Controller{  
        public void doAnnotationHandler(){  
            System.out.println("annotation...");  
        }  
    }  
      
      
    //下面编写适配器类  
      
    public class SimpleHandlerAdapter implements HandlerAdapter {  
      
      
        public void handle(Object handler) {  
            ((SimpleController)handler).doSimplerHandler();  
        }  
      
        public boolean supports(Object handler) {  
            return (handler instanceof SimpleController);  
        }  
      
    }  
      
      
    public class HttpHandlerAdapter implements HandlerAdapter {  
      
        public void handle(Object handler) {  
            ((HttpController)handler).doHttpHandler();  
        }  
      
        public boolean supports(Object handler) {  
            return (handler instanceof HttpController);  
        }  
      
    }  
      
      
      
    public class AnnotationHandlerAdapter implements HandlerAdapter {  
      
        public void handle(Object handler) {  
            ((AnnotationController)handler).doAnnotationHandler();  
        }  
      
        public boolean supports(Object handler) {  
              
            return (handler instanceof AnnotationController);  
        }  
      
    }  
      
      
    //模拟一个DispatcherServlet  
    import java.util.ArrayList;  
    import java.util.List;  
      
      
    public class DispatchServlet {  
          
        public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();   
          
        public DispatchServlet(){  
            handlerAdapters.add(new AnnotationHandlerAdapter());  
            handlerAdapters.add(new HttpHandlerAdapter());  
            handlerAdapters.add(new SimpleHandlerAdapter());  
        }  
          
          
        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;  
        }  
          
        public static void main(String[] args){  
            new DispatchServlet().doDispatch();  
        }  
          
    }  



    通过这个模式可以看出 开源代码 中的精妙, 我们在看框架源码时需要有目标的看,这样会找到很多自己需要学习的东西, 目前很多分析源码的帖子大部分是讲解what,how, 
    以此来抛砖引玉,希望各位能够一起来讨论 “why ”

    转载自:http://blog.csdn.net/w1033162186/article/details/50635348

  • 相关阅读:
    .net remoting学习(2)MarshalByRefObject与对象激活
    Android之旅Service
    Android之旅Handler与多线程
    Android之旅广播(BroadCast)
    .net remoting学习(3) 配置与服务端广播
    网址收藏
    Asp.net生命周期
    Android API 拦截系统短消息
    TCL脚本语言学习
    实现一个包含Microsoft.Advertising和SmartMad广告控件的UserControl
  • 原文地址:https://www.cnblogs.com/tongkey/p/7919401.html
Copyright © 2011-2022 走看看