zoukankan      html  css  js  c++  java
  • 适配器模式



    在学习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
            }
    }
    


  • 相关阅读:
    java--exceptions
    java-interface
    Java笔记
    memcpy
    const 关键字
    LeeCode整数 反转
    函数调用运算符笔记
    cvCreateImage
    c++继承笔记1
    虚拟机下的debian无法登陆
  • 原文地址:https://www.cnblogs.com/Howlet/p/12408387.html
Copyright © 2011-2022 走看看