SpringMVC適配器模式代碼示例
此處采用了適配器模式, 由于Controller的類型不同,有多重實現(xiàn)方式,那么調(diào)用方式就不是確定的,如果需要直接調(diào)用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有一種對應的適配器實現(xiàn)類,
讓適配器代替controller執(zhí)行相應的方法。這樣在擴展Controller 時,只需要增加一個適配器類就完成了SpringMVC的擴展了,真的是很精巧的做法!
廢話不多說還是上代碼吧,為了看得清楚,就自己實現(xiàn)一套代碼來模擬springMVC, 直接貼Spring源碼容易降低關注點。
//定義一個Adapter接口
public interface HandlerAdapter {
public Boolean supports(Object handler);
public void handle(Object handler);
}
//以下是三種Controller實現(xiàn)
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出,可以出,
//不論實現(xiàn)何種Controller,適配器總能經(jīng)過適配以后得到想要的結(jié)果
// HttpController controller = new HttpController();
// AnnotationController controller = new AnnotationController();
SimpleController controller = new SimpleController();
//得到對應適配器
HandlerAdapter adapter = getHandler(controller);
//通過適配器執(zhí)行對應的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”
總結(jié)
以上就是本文關于SpringMVC適配器模式代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關文章
mybatis 中 foreach collection的用法小結(jié)(三種)
這篇文章主要介紹了mybatis 中 foreach collection的用法小結(jié)(三種),需要的朋友可以參考下2017-10-10
在Mybatis @Select注解中實現(xiàn)拼寫動態(tài)sql
這篇文章主要介紹了在Mybatis @Select注解中實現(xiàn)拼寫動態(tài)sql,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
使用JPA雙向多對多關聯(lián)關系@ManyToMany
這篇文章主要介紹了使用JPA雙向多對多關聯(lián)關系@ManyToMany,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
java實現(xiàn)大數(shù)加法(BigDecimal)的實例代碼
之前寫過用vector、string實現(xiàn)大數(shù)加法,現(xiàn)在用java的BigDecimal類,代碼簡單很多。但是在online-judge上,java的代碼運行時間和內(nèi)存大得多2013-10-10

