SpringMVC适配器模式代码示例

 更新时间:2017年11月29日 15:48:59   作者:Tongkey   我要评论
这篇文章主要介绍了SpringMVC适配器模式代码示例,涉及模拟springmvc的Java代码等相关内容,具有一定借鉴价值,需要的朋友可以参考下。

此处采用了适配器模式, 由于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适配器模式代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • spring缓存代码详解

    spring缓存代码详解

    这篇文章主要介绍了spring缓存代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • SSH框架网上商城项目第20战之在线支付平台

    SSH框架网上商城项目第20战之在线支付平台

    这篇文章主要为大家详细介绍了SSH框架网上商城项目第20战之在线支付平台,关于第三方支付的内容从本文开始,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • java 中模拟UDP传输的发送端和接收端实例详解

    java 中模拟UDP传输的发送端和接收端实例详解

    这篇文章主要介绍了java 中模拟UDP传输的发送端和接收端实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • 利用java实现邮箱群发功能

    利用java实现邮箱群发功能

    这篇文章主要为大家详细介绍了利用java实现邮箱群发功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • struts2实现多文件上传

    struts2实现多文件上传

    这篇文章主要为大家详细介绍了struts2实现多文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • spring配置文件加密方法示例

    spring配置文件加密方法示例

    这篇文章主要介绍了spring配置文件加密方法示例,简单介绍了什么是配置文件,然后分享了在实际生产环境中,对配置文件不允许出现明文用户名及密码等信息需求的Java实现代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 构建SpringBoot+MyBatis+Freemarker的项目详解

    构建SpringBoot+MyBatis+Freemarker的项目详解

    在本篇内容里小编给大家整理的是关于构建SpringBoot+MyBatis+Freemarker的项目的具体步骤以及实例代码,需要的朋友们参考下。
    2019-06-06
  • Java数据结构之线性表

    Java数据结构之线性表

    线性表是其组成元素间具有线性关系的一种数据结构,对线性表的基本操作主要有,获取元素,设置元素值,遍历,插入,删除,查找,替换,排序等。而线性表可以采用顺序储存结构和链式储存结构,本节主要讲解顺序表、单链表以及双链表的各种基本操作。
    2017-03-03
  • Java函数式编程(五):闭包

    Java函数式编程(五):闭包

    这篇文章主要介绍了Java函数式编程(五):闭包,本文是系列文章的第5篇,其它篇章请参阅相关文章,需要的朋友可以参考下
    2014-09-09
  • 详解Java常用工具类—泛型

    详解Java常用工具类—泛型

    这篇文章主要介绍了Java常用工具类—泛型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03

最新评论