zoukankan      html  css  js  c++  java
  • 设计模式课程 设计模式精讲 19-3 策略模式源码解析

    1    源码解析

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

    1.2    源码解析2jdk中的应用2

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

    1.4    源码解析4Spring中的应用2

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

    java.util.Comparator(策略类)作为比较器的应用

    package java.util;
    
    
    public interface Comparator<T> {
      
        int compare(T o1, T o2);
    
        boolean equals(Object obj);
    }

    java.util.ArrayList(策略类应用)

    package java.util;
    
    import java.lang.reflect.*;
    
    public class Arrays {
    
        public static <T> void sort(T[] a, Comparator<? super T> c) {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, c);
        }
    
    }
    1.2    源码解析2jdk中的应用2

    java.util.Comparator(策略类)作为比较器的应用

    package java.util;
    
    
    public interface Comparator<T> {
      
        int compare(T o1, T o2);
    
        boolean equals(Object obj);
    }



    java.util.TreeMap(策略类应用)

    public class TreeMap<K,V>
        extends AbstractMap<K,V>
        implements NavigableMap<K,V>, Cloneable, java.io.Serializable
    {
        /**
         * The comparator used to maintain order in this tree map, or
         * null if it uses the natural ordering of its keys.
         *
         * @serial
         */
        private final Comparator<? super K> comparator;
    
      //此处涉及到泛型的应用,关于泛型==》详细可以查看文章 ==》java后台==》数据类型==》泛型使用部分
    final int compare(Object k1, Object k2) { return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2) : comparator.compare((K)k1, (K)k2); } }
    1.3    源码解析3(Spring中的应用1)诸多方法被策略行为类调用

    org.springframework.core.io.Resource(策略抽象)

    package org.springframework.core.io;
    
    import java.io.File;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URL;
    
    public interface Resource extends InputStreamSource {
        boolean exists();
    
        boolean isReadable();
    
        boolean isOpen();
    
        URL getURL() throws IOException;
    
        URI getURI() throws IOException;
    
        File getFile() throws IOException;
    
        long contentLength() throws IOException;
    
        long lastModified() throws IOException;
    
        Resource createRelative(String var1) throws IOException;
    
        String getFilename();
    
        String getDescription();
    }

    策略行为类:FileSystemResource,ClassPathResource,InputStreamResource,PathResource等等

    1.4    源码解析4(Spring中的应用2之bean的初始化应用)(特殊之处是策略行为之间继承,共同实现策略类)

    InstantiationStrategy(初始化策略接口)

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package org.springframework.beans.factory.support;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.BeanFactory;
    
    public interface InstantiationStrategy {
        Object instantiate(RootBeanDefinition var1, String var2, BeanFactory var3) throws BeansException;
    
        Object instantiate(RootBeanDefinition var1, String var2, BeanFactory var3, Constructor<?> var4, Object[] var5) throws BeansException;
    
        Object instantiate(RootBeanDefinition var1, String var2, BeanFactory var3, Object var4, Method var5, Object[] var6) throws BeansException;
    }

    SimpleInstantiationStrategy (策略父类)

    package org.springframework.beans.factory.support;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.security.AccessController;
    import java.security.PrivilegedAction;
    import java.security.PrivilegedExceptionAction;
    import org.springframework.beans.BeanInstantiationException;
    import org.springframework.beans.BeanUtils;
    import org.springframework.beans.factory.BeanDefinitionStoreException;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.util.ReflectionUtils;
    import org.springframework.util.StringUtils;
    
    public class SimpleInstantiationStrategy implements InstantiationStrategy {
        private static final ThreadLocal<Method> currentlyInvokedFactoryMethod = new ThreadLocal();
    
       public Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) {
            ...
        }
    
        protected Object instantiateWithMethodInjection(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) {
            throw new UnsupportedOperationException("Method Injection not supported in SimpleInstantiationStrategy");
        }
    
        public Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner, final Constructor<?> ctor, Object[] args) {
            ...
        }
    
        protected Object instantiateWithMethodInjection(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner, Constructor<?> ctor, Object[] args) {
            throw new UnsupportedOperationException("Method Injection not supported in SimpleInstantiationStrategy");
        }
    
        public Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner, Object factoryBean, final Method factoryMethod, Object[] args) {
            ...
        }
    }

    CglibSubclassingInstantiationStrategy (策略子类)

    package org.springframework.beans.factory.support;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.beans.BeanInstantiationException;
    import org.springframework.beans.BeanUtils;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.cglib.core.SpringNamingPolicy;
    import org.springframework.cglib.proxy.Callback;
    import org.springframework.cglib.proxy.CallbackFilter;
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.Factory;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    import org.springframework.cglib.proxy.NoOp;
    
    public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationStrategy {
        private static final int PASSTHROUGH = 0;
        private static final int LOOKUP_OVERRIDE = 1;
        private static final int METHOD_REPLACER = 2;
    
        public CglibSubclassingInstantiationStrategy() {
        }
    
        protected Object instantiateWithMethodInjection(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) {
            return this.instantiateWithMethodInjection(beanDefinition, beanName, owner, (Constructor)null, (Object[])null);
        }
    
        protected Object instantiateWithMethodInjection(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner, Constructor<?> ctor, Object[] args) {
            return (new CglibSubclassingInstantiationStrategy.CglibSubclassCreator(beanDefinition, owner)).instantiate(ctor, args);
        }
    ...
        
    }
  • 相关阅读:
    【转】各种图(流程图,思维导图,UML,拓扑图,ER图)简介
    【转】C缺陷和陷阱学习笔记
    【转】嵌入式C语言调试开关
    【转】循环冗余校验(CRC)算法入门引导
    idea非web项目打jar包运行
    centos7安装docker 部署springcloud
    centos7 unixodbc 连接mysql
    Mysql Communications link failure 终级解决办法
    https自签证书
    jenkins 打包 springboot
  • 原文地址:https://www.cnblogs.com/1446358788-qq/p/12309270.html
Copyright © 2011-2022 走看看