中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringMVC適配器模式代碼示例

發布時間:2020-10-13 11:54:46 來源:腳本之家 閱讀:190 作者:Tongkey 欄目:編程語言

此處采用了適配器模式, 由于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適配器模式代碼示例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万宁市| 岳池县| 秭归县| 彩票| 崇礼县| 原平市| 新和县| 嵊州市| 手机| 滨州市| 克拉玛依市| 汉寿县| 林西县| 湘阴县| 昌都县| 凌海市| 延川县| 阿鲁科尔沁旗| 石嘴山市| 双桥区| 桐梓县| 双流县| 绵阳市| 永福县| 来宾市| 焦作市| 武城县| 樟树市| 建宁县| 苍山县| 丰宁| 应城市| 阜宁县| 乌海市| 板桥市| 黎平县| 普陀区| 云龙县| 济宁市| 乳山市| 福海县|