随机名言

适配器模式



在学习SpringMVC的过程中,看到了适配器模式,然后就记下了,回来填坑


1. 适配器模式(Adapter Pattern)

将一个接口转换成客户希望的另一个接口,使不兼容的类可一起工作,其组成可分为:


  • Target:客户所需要的接口
  • Adapter:适配器
  • Adaptee:被适配者




2. 流程


2.1 Adaptee

public class Adaptee {
	
	public void adapteeMethod(){
		System.out.println("被适配者的方法执行了");
	}
}

2.2 Target

public interface Target {

    public void targetMethod();
}

2.3 Adapter

public class Adapter implements Target {
	
	private Adaptee adaptee;
	
	public Adapter(Adaptee adaptee){
		this.adaptee = adaptee;
	}

	@Override
	public void targetMethod() {
		adaptee.adapteeMethod();
	}
}

2.4 测试

public class test {
	
	public static void main(String[] args) {
		
		// 创建被适配者
		Adaptee adaptee = new Adaptee();
		
		// 创建适配器
		Adapter adapter = new Adapter(adaptee);
		
		adapter.targetMethod();
	}
}




3. SpringMVC中的应用

先放一张请求流程图,其中涉及到了映射器和适配器以及处理器


网图,侵删


用户发送请求,然后DispatcherServlet通过HandlerMapping映射出对应的Handler以及相关的Interceptors,将这二者绑定到HandlerExecutionChain并返回


由于Handler有很多种类,调用方法也参次不齐,如果将其传进给DispatcherServlet,那么调用方法的时候则需用if(paramHandler instanceof XXXHandler)这样判断,再调用该Handler的方法,如果Handler种类再继续增加,则需要在DispatcherServlet增加判断,违反开闭原则(对修改关闭,对扩展开放),那么适配器模式就出场了


Spring提供一个适配器模式中的Target接口,那么只要实现了Adapter就可以适配一种Handler,不用在DispatcherServlet里进行判断了。DispatcherServlet内部通过HandlerMapping获取对应的Handler,然后通过Handler来获取HandlerAdapter,最后调用HandlerAdapter的handler方法即可实现处理器功能。此时如果增加一种Handler,则只要增多一个HandlerAdapter实现类即可


这里Handler是广义的,包括我们常说的Controller、Servlet、HttpRequestHandler



Target接口

public interface HandlerAdapter {
 
    // 判断是否支持该Handler
	boolean supports(Object handler);
	
    // 适配Handler,并使Handler执行
	ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

}

DispatcherServlet中的doDispatch方法

为了聚集关注点只列出了相关的源码


protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		try {
            
        	// 变量提升
			ModelAndView mv = null;
			Exception dispatchException = null;
 
			try {
                
                // 处理请求
				processedRequest = checkMultipart(request);
				multipartRequestParsed = (processedRequest != request);
 
				// 通过HandlerMapping来获取映射出的Handler
				mappedHandler = getHandler(processedRequest);
				if (mappedHandler == null || mappedHandler.getHandler() == null) {
					noHandlerFound(processedRequest, response);
					return;
				}
 
				// 调用HandlerAdapter的handle方法并返回ModelAndView,适配器模式中的对象适配
				mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
 
                // 返回ModelAndView
				applyDefaultViewName(processedRequest, mv);
				mappedHandler.applyPostHandle(processedRequest, response, mv);
			}
			catch (Exception e) {
				XXXXX
			}finally {
                XXXXX
			}
        }catch (Exception e) {
            XXXXX
        }
}


posted @ 2020-03-04 11:18  Howlet  阅读(188)  评论(0编辑  收藏  举报

Copyright © By Howl