首页 > 开发 > Java > 正文

SpringMVC适配器模式代码示例

2024-07-13 10:13:31
字体:
来源:转载
供稿:网友

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


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表