设计模式课程 设计模式精讲 12-3 适配器模式源码解析

Posted 1446358788-qq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式课程 设计模式精讲 12-3 适配器模式源码解析相关的知识,希望对你有一定的参考价值。

1    源码解析

1.1  源码解析1(在jdk中的应用)

1.2  源码解析2(Spring中的通知管理)

1.3  源码解析3(SpringMVC中的应用)

 

 

1    源码解析

1.1  源码解析1(在jdk中的应用)

xmlAdapter(此类是用于适配xml的一个类,是处理xml序列化和反序列化的一个类)

public abstract class XmlAdapter<ValueType,BoundType> 

    /**
     * Do-nothing constructor for the derived classes.
     */
    protected XmlAdapter() 

    /**
     *  处理反序列化*/
    public abstract BoundType unmarshal(ValueType v) throws Exception;

    /**
      * 处理序列化*/
    public abstract ValueType marshal(BoundType v) throws Exception;

 

对于xml序列化的时候,我们时间可以写一个date类,可以继承xmlAdapter抽象类,实现它的序列化和反序列化方法。

 

1.2  源码解析2(Spring中的通知管理)

功能描述:

通知适配器将通知类适配成各种类型的通知,如:前置通知,后置通知等等(关于通知的课程可以详细查看我的spring笔记)

 

通知适配器接口:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.aop.framework.adapter;

import org.aopalliance.aop.Advice;
import org.aopalliance.intercept.MethodInterceptor;
import org.springframework.aop.Advisor;

public interface AdvisorAdapter 
    boolean supportsAdvice(Advice var1);

    MethodInterceptor getInterceptor(Advisor var1);

 

前置通知适配器实现类:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.aop.framework.adapter;

import java.io.Serializable;
import org.aopalliance.aop.Advice;
import org.aopalliance.intercept.MethodInterceptor;
import org.springframework.aop.Advisor;
import org.springframework.aop.MethodBeforeAdvice;

class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable 
    MethodBeforeAdviceAdapter() 
    

    public boolean supportsAdvice(Advice advice) 
        return advice instanceof MethodBeforeAdvice;
    

    public MethodInterceptor getInterceptor(Advisor advisor) 
        MethodBeforeAdvice advice = (MethodBeforeAdvice)advisor.getAdvice();
        return new MethodBeforeAdviceInterceptor(advice);
    

 

advisor组合得到通知类:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.aop;

import org.aopalliance.aop.Advice;

public interface Advisor 
    Advice getAdvice();

    boolean isPerInstance();

 

MethodBeforeAdvice继承超类(隔了好几层继承实现):

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.aopalliance.intercept;

import org.aopalliance.aop.Advice;

public interface Interceptor extends Advice 

 

1.3  源码解析3(SpringMVC中的应用)

重点关注:

springmvc中,通过处理映射器(handlerMapper)找到对应的handler(controler,servlet或者httpRequestHandler)

现在是多个适配器,对应多个

 

适配器接口:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.web.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface HandlerAdapter 
    boolean supports(Object var1);

    ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;

    long getLastModified(HttpServletRequest var1, Object var2);

 

适配器类:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.web.servlet.mvc;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.ModelAndView;

public class SimpleControllerHandlerAdapter implements HandlerAdapter 
    public SimpleControllerHandlerAdapter() 
    

  /** 如果对应的handler有确切的Controller并支持的话,返回true,否则,返回false
   */
public boolean supports(Object handler) return handler instanceof Controller; public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception return ((Controller)handler).handleRequest(request, response); public long getLastModified(HttpServletRequest request, Object handler) return handler instanceof LastModified ? ((LastModified)handler).getLastModified(request) : -1L;

 

DispatcherServlet(通过handlermapper找到对应的handler,适配器中的client)

 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception 
        HttpServletRequest processedRequest = request;
        HandlerExecutionChain mappedHandler = null;
        boolean multipartRequestParsed = false;
        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

        try 
            try 
                ModelAndView mv = null;
                Exception dispatchException = null;

                try 
                    processedRequest = this.checkMultipart(request);
                    multipartRequestParsed = processedRequest != request;
                    mappedHandler = this.getHandler(processedRequest);
                    if (mappedHandler == null || mappedHandler.getHandler() == null) 
                        this.noHandlerFound(processedRequest, response);
                        return;
                    

                    HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
                    String method = request.getMethod();
                    boolean isGet = "GET".equals(method);
                    if (isGet || "HEAD".equals(method)) 
                        long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
                        if (this.logger.isDebugEnabled()) 
                            this.logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);
                        

                        if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) 
                            return;
                        
                    

                    if (!mappedHandler.applyPreHandle(processedRequest, response)) 
                        return;
                    

                    try 
            //通过适配器handle方法,返回对应的model&View对象 mv
= ha.handle(processedRequest, response, mappedHandler.getHandler()); finally if (asyncManager.isConcurrentHandlingStarted()) return; this.applyDefaultViewName(request, mv); mappedHandler.applyPostHandle(processedRequest, response, mv); catch (Exception var27) dispatchException = var27; this.processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); catch (Exception var28) this.triggerAfterCompletion(processedRequest, response, mappedHandler, var28); catch (Error var29) this.triggerAfterCompletionWithError(processedRequest, response, mappedHandler, var29); finally if (asyncManager.isConcurrentHandlingStarted()) mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response); return; else if (multipartRequestParsed) this.cleanupMultipart(processedRequest);

 

controller接口:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.web.servlet.mvc;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;

public interface Controller 
    ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;

 

以上是关于设计模式课程 设计模式精讲 12-3 适配器模式源码解析的主要内容,如果未能解决你的问题,请参考以下文章

设计模式课程 设计模式精讲 27-1 状态模式讲解

设计模式课程 设计模式精讲 3-2 开闭原则 coding

设计模式课程 设计模式精讲 13-1 享元模式讲解

设计模式课程 设计模式精讲 20-1 解释器模式讲解

设计模式课程 设计模式精讲 18-1 迭代器模式讲解

设计模式课程 设计模式精讲 13-1 享元模式coding