SpringMVC 어댑터 모드 코드 예

여기에는 어댑터 모드가 사용됩니다. 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에 대응하는 어댑터 구현 클래스를 정의합니다.
컨트롤러 대신 어댑터를 실행하는 방법이렇게 컨트롤러를 확장할 때 어댑터 클래스를 하나만 추가하면 SpringMVC의 확장을 완성할 수 있습니다. 정말 정교한 방법입니다!
쓸데없는 말은 하지 말고 코드를 붙여라. 똑똑히 보기 위해 스프링 MVC를 시뮬레이션하기 위해 직접 스프링 원본을 붙이면 관심사를 낮추기 쉽다.

// 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 어댑터 모드 코드 예시에 관한 모든 내용입니다. 여러분께 도움이 되기를 바랍니다.관심 있는 친구는 본 사이트의 다른 관련 주제를 계속 참고할 수 있습니다. 부족한 점이 있으면 댓글로 지적해 주십시오.여러분의 본 사이트에 대한 지지에 감사 드립니다!

좋은 웹페이지 즐겨찾기