溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

SpringMVC適配器模式代碼示例

發(fā)布時(shí)間:2020-10-13 11:54:46 來(lái)源:腳本之家 閱讀:188 作者:Tongkey 欄目:編程語(yǔ)言

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

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

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

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

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

//定義一個(gè)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...");
	}
}
//下面編寫(xiě)適配器類(lèi) 
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);
	}
}
//模擬一個(gè)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的對(duì)象,僅僅new出,可以出,        
		//不論實(shí)現(xiàn)何種Controller,適配器總能經(jīng)過(guò)適配以后得到想要的結(jié)果 
		//   HttpController controller = new HttpController(); 
		//   AnnotationController controller = new AnnotationController(); 
		SimpleController controller = new SimpleController();
		//得到對(duì)應(yīng)適配器 
		HandlerAdapter adapter = getHandler(controller);
		//通過(guò)適配器執(zhí)行對(duì)應(yīng)的controller對(duì)應(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();
	}
}

通過(guò)這個(gè)模式可以看出開(kāi)源代碼中的精妙,我們?cè)诳纯蚣茉创a時(shí)需要有目標(biāo)的看,這樣會(huì)找到很多自己需要學(xué)習(xí)的東西,目前很多分析源碼的帖子大部分是講解what,how,

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

總結(jié)

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

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI