SpringMVC适配器模式代码示例
2017-11-29 15:48
531 查看
此处采用了适配器模式, 由于Controller的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要在代码中写成如下形式:
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源码容易降低关注点。
//定义一个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”
总结
以上就是本文关于SpringMVC适配器模式代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
您可能感兴趣的文章:
相关文章推荐
- springmvc整合mybatis分页代码示例
- SpringMVC接收复杂集合对象(参数)代码示例
- springmvc 返回json数据给移动端,配置及代码示例
- SpringMVC文件上传及查看的示例代码
- SpringMVC中的拦截器详解及代码示例
- springMVC实现前台带进度条文件上传的示例代码
- SpringMVC 限流的示例代码
- SpringMVC框架实现上传图片的示例代码
- SpringMVC处理multipart请求的示例代码
- springmvc集成shiro登录权限示例代码
- springmvc实现jfreechart 代码示例
- springmvc限流拦截器的示例代码
- 设计模式之适配器模式代码示例
- 18. SpringMVC_ModelAttribute注解之示例代码
- springmvc Rest风格介绍及实现代码示例
- springmvc的validator数据校验的实现示例代码
- SpringMvc微信支付回调示例代码
- springmvc实现导出数据信息为excle表格示例代码
- springMVC拦截器HandlerInterceptor用法代码示例
- springmvc入门示例(必要的代码+大致流程)