最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC適配器模式代碼示例

 更新時間:2017年11月29日 15:48:59   作者:Tongkey  
這篇文章主要介紹了SpringMVC適配器模式代碼示例,涉及模擬springmvc的Java代碼等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。

此處采用了適配器模式, 由于Controller的類型不同,有多重實(shí)現(xiàn)方式,那么調(diào)用方式就不是確定的,如果需要直接調(diào)用Controller方法,需要在代碼中寫成如下形式:

if(mappedHandler.getHandler() instanceof MultiActionController){ 
  ((MultiActionController)mappedHandler.getHandler()).xxx 
}else if(mappedHandler.getHandler() instanceof XXX){ 
  ... 
}else if(...){ 
  ... 
}

這樣假設(shè)如果我們增加一個HardController,就要在代碼中加入一行 if(mappedHandler.getHandler() instanceof HardController)
這種形式就使得程序難以維護(hù),也違反了設(shè)計(jì)模式中的開閉原則 -- 對擴(kuò)展開放,對修改關(guān)閉。

因此Spring定義了一個適配接口,使得每一種Controller有一種對應(yīng)的適配器實(shí)現(xiàn)類,
讓適配器代替controller執(zhí)行相應(yīng)的方法。這樣在擴(kuò)展Controller 時,只需要增加一個適配器類就完成了SpringMVC的擴(kuò)展了,真的是很精巧的做法!

廢話不多說還是上代碼吧,為了看得清楚,就自己實(shí)現(xiàn)一套代碼來模擬springMVC, 直接貼Spring源碼容易降低關(guān)注點(diǎn)。

//定義一個Adapter接口 
public interface HandlerAdapter {
	public Boolean supports(Object handler);
	public void handle(Object handler);
}
//以下是三種Controller實(shí)現(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出,可以出,        
		//不論實(shí)現(xiàn)何種Controller,適配器總能經(jīng)過適配以后得到想要的結(jié)果 
		//   HttpController controller = new HttpController(); 
		//   AnnotationController controller = new AnnotationController(); 
		SimpleController controller = new SimpleController();
		//得到對應(yīng)適配器 
		HandlerAdapter adapter = getHandler(controller);
		//通過適配器執(zhí)行對應(yīng)的controller對應(yīng)方法 
		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();
	}
}

通過這個模式可以看出開源代碼中的精妙,我們在看框架源碼時需要有目標(biāo)的看,這樣會找到很多自己需要學(xué)習(xí)的東西,目前很多分析源碼的帖子大部分是講解what,how,

以此來拋磚引玉,希望各位能夠一起來討論“why”

總結(jié)

以上就是本文關(guān)于SpringMVC適配器模式代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • JAVA 多線程之信號量(Semaphore)實(shí)例詳解

    JAVA 多線程之信號量(Semaphore)實(shí)例詳解

    這篇文章主要介紹了JAVA 多線程之信號量(Semaphore)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Mybatis的dao層,service層的封裝方式

    Mybatis的dao層,service層的封裝方式

    這篇文章主要介紹了Mybatis的dao層,service層的封裝方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring如何根據(jù)條件創(chuàng)建bean,@Conditional注解使用方式

    Spring如何根據(jù)條件創(chuàng)建bean,@Conditional注解使用方式

    這篇文章主要介紹了Spring如何根據(jù)條件創(chuàng)建bean,@Conditional注解使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java 增強(qiáng)型for循環(huán)語法詳解

    java 增強(qiáng)型for循環(huán)語法詳解

    增強(qiáng)型 for 循環(huán)(也稱為 “for-each” 循環(huán))是 Java 從 JDK 5 開始引入的一種便捷循環(huán)語法,旨在簡化對數(shù)組或集合類的迭代操作,這篇文章主要介紹了java 增強(qiáng)型for循環(huán) 詳解,需要的朋友可以參考下
    2025-04-04
  • java 字符串截取的實(shí)例詳解

    java 字符串截取的實(shí)例詳解

    這篇文章主要介紹了java 字符串截取的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java?CAS與JUC組件詳解

    Java?CAS與JUC組件詳解

    CAS是一種基于樂觀鎖的無鎖并發(fā)控制技術(shù),其核心邏輯可以概括為:“我認(rèn)為當(dāng)前值應(yīng)該是A,如果是,則更新為B;否則放棄或重試”,整個過程由硬件保證原子性,無需傳統(tǒng)鎖機(jī)制,本文給大家介紹Java?CAS與JUC組件的相關(guān)知識,感興趣的朋友一起看看吧
    2025-04-04
  • SpringBoot中定時任務(wù)的使用方法解析

    SpringBoot中定時任務(wù)的使用方法解析

    這篇文章主要介紹了SpringBoot中定時任務(wù)的使用方法解析,@EnableScheduling?注解,它的作用是發(fā)現(xiàn)注解?@Scheduled的任務(wù)并由后臺執(zhí)行,沒有它的話將無法執(zhí)行定時任務(wù),需要的朋友可以參考下
    2024-01-01
  • MyBatis的SUM映射問題及解決

    MyBatis的SUM映射問題及解決

    這篇文章主要介紹了MyBatis的SUM映射問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java數(shù)據(jù)結(jié)構(gòu) 遞歸之迷宮回溯案例講解

    Java數(shù)據(jù)結(jié)構(gòu) 遞歸之迷宮回溯案例講解

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)遞歸之迷宮回溯案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • java連接SQL?Server數(shù)據(jù)庫圖文教程(自用)

    java連接SQL?Server數(shù)據(jù)庫圖文教程(自用)

    在Java應(yīng)用程序中,我們經(jīng)常需要與數(shù)據(jù)庫進(jìn)行交互,下面這篇文章主要給大家介紹了關(guān)于java連接SQL?Server數(shù)據(jù)庫的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06

最新評論

苍山县| 类乌齐县| 荆州市| 庐江县| 宾阳县| 正蓝旗| 漳平市| 夏津县| 孙吴县| 五河县| 余姚市| 潞城市| 敦煌市| 毕节市| 扬中市| 杭州市| 贡嘎县| 梁河县| 揭东县| 萝北县| 石泉县| 绵竹市| 灵寿县| 乐业县| 衢州市| 吴川市| 花莲市| 安徽省| 方城县| 黑水县| 武威市| 滦平县| 克山县| 铁力市| 阿拉善盟| 湖南省| 南安市| 绵竹市| 洛浦县| 房产| 内丘县|