SpringMVC适配器模式代码示例
程序员文章站
2024-02-26 11:18:28
此处采用了适配器模式, 由于controller的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用controller方法,需要在代码中写成如下形式:...
此处采用了适配器模式, 由于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适配器模式代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!