SpringMVC适配器模式代码示例
此处采用了适配器模式,由于Controller的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要在代码中写成如下形式:
if(mappedHandler.getHandler()instanceofMultiActionController){
((MultiActionController)mappedHandler.getHandler()).xxx
}elseif(mappedHandler.getHandler()instanceofXXX){
...
}elseif(...){
...
}
这样假设如果我们增加一个HardController,就要在代码中加入一行if(mappedHandler.getHandler()instanceofHardController)
这种形式就使得程序难以维护,也违反了设计模式中的开闭原则--对扩展开放,对修改关闭。
因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,
让适配器代替controller执行相应的方法。这样在扩展Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展了,真的是很精巧的做法!
废话不多说还是上代码吧,为了看得清楚,就自己实现一套代码来模拟springMVC,直接贴Spring源码容易降低关注点。
//定义一个Adapter接口
publicinterfaceHandlerAdapter{
publicBooleansupports(Objecthandler);
publicvoidhandle(Objecthandler);
}
//以下是三种Controller实现
publicinterfaceController{
}
publicclassHttpControllerimplementsController{
publicvoiddoHttpHandler(){
System.out.println("http...");
}
}
publicclassSimpleControllerimplementsController{
publicvoiddoSimplerHandler(){
System.out.println("simple...");
}
}
publicclassAnnotationControllerimplementsController{
publicvoiddoAnnotationHandler(){
System.out.println("annotation...");
}
}
//下面编写适配器类
publicclassSimpleHandlerAdapterimplementsHandlerAdapter{
publicvoidhandle(Objecthandler){
((SimpleController)handler).doSimplerHandler();
}
publicBooleansupports(Objecthandler){
return(handlerinstanceofSimpleController);
}
}
publicclassHttpHandlerAdapterimplementsHandlerAdapter{
publicvoidhandle(Objecthandler){
((HttpController)handler).doHttpHandler();
}
publicBooleansupports(Objecthandler){
return(handlerinstanceofHttpController);
}
}
publicclassAnnotationHandlerAdapterimplementsHandlerAdapter{
publicvoidhandle(Objecthandler){
((AnnotationController)handler).doAnnotationHandler();
}
publicBooleansupports(Objecthandler){
return(handlerinstanceofAnnotationController);
}
}
//模拟一个DispatcherServlet
importjava.util.ArrayList;
importjava.util.List;
publicclassDispatchServlet{
publicstaticListhandlerAdapters=newArrayList();
publicDispatchServlet(){
handlerAdapters.add(newAnnotationHandlerAdapter());
handlerAdapters.add(newHttpHandlerAdapter());
handlerAdapters.add(newSimpleHandlerAdapter());
}
publicvoiddoDispatch(){
//此处模拟SpringMVC从request取handler的对象,仅仅new出,可以出,
//不论实现何种Controller,适配器总能经过适配以后得到想要的结果
//HttpControllercontroller=newHttpController();
//AnnotationControllercontroller=newAnnotationController();
SimpleControllercontroller=newSimpleController();
//得到对应适配器
HandlerAdapteradapter=getHandler(controller);
//通过适配器执行对应的controller对应方法
adapter.handle(controller);
}
publicHandlerAdaptergetHandler(Controllercontroller){
for(HandlerAdapteradapter:this.handlerAdapters){
if(adapter.supports(controller)){
returnadapter;
}
}
returnnull;
}
publicstaticvoidmain(String[]args){
newDispatchServlet().doDispatch();
}
}
通过这个模式可以看出开源代码中的精妙,我们在看框架源码时需要有目标的看,这样会找到很多自己需要学习的东西,目前很多分析源码的帖子大部分是讲解what,how,
以此来抛砖引玉,希望各位能够一起来讨论“why”
总结
以上就是本文关于SpringMVC适配器模式代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!