美文网首页
设计模式总结

设计模式总结

作者: yinhaijun | 来源:发表于2019-05-27 11:34 被阅读0次

    工厂模式

    只对结果负责,封装创建过程,如BeanFactory

        Object getBean(String name) throws BeansException;
    

    单例模式

    保证独一无二,如ApplicationContext

    原型模式

    拔一根猴毛,吹出千万个,如BeanUtils

        public static void copyProperties(Object source, Object target) throws BeansException {
            copyProperties(source, target, null, (String[]) null);
        }
    

    代理模式

    招人办事,增强职责,如JdkDynamicAopProxy

    final class JdkDynamicAopProxy implements AopProxy, InvocationHandler, Serializable {
    
        @Override
        public Object getProxy(@Nullable ClassLoader classLoader) {
            if (logger.isDebugEnabled()) {
                logger.debug("Creating JDK dynamic proxy: target source is " + this.advised.getTargetSource());
            }
            Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true);
            findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
            return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
        }
    
        @Override
        @Nullable
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            MethodInvocation invocation;
            Object oldProxy = null;
            boolean setProxyContext = false;
    
            TargetSource targetSource = this.advised.targetSource;
    

    还有CglibAopProxy

    class CglibAopProxy implements AopProxy, Serializable {
    
          //...
    
        private static class StaticUnadvisedInterceptor implements MethodInterceptor, Serializable {
            @Override
            @Nullable
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                Object retVal = methodProxy.invoke(this.target, args);
                return processReturnType(proxy, this.target, method, retVal);
            }
          //...
    
         private static class EqualsInterceptor implements MethodInterceptor, Serializable {
            @Override
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) {
                Object other = args[0];
                if (proxy == other) {
                    return true;
                }
                if (other instanceof Factory) {
                    Callback callback = ((Factory) other).getCallback(INVOKE_EQUALS);
                    if (!(callback instanceof EqualsInterceptor)) {
                        return false;
                    }
                    AdvisedSupport otherAdvised = ((EqualsInterceptor) callback).advised;
                    return AopProxyUtils.equalsInProxy(this.advised, otherAdvised);
                }
                else {
                    return false;
                }
            }
    
        //...
    

    委派模式

    干活算你的(普通员工),功劳算我的(项目经理),如DispatcherServlet

    @Nullable
        protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
            if (this.handlerMappings != null) {
                for (HandlerMapping hm : this.handlerMappings) {
                    if (logger.isTraceEnabled()) {
                        logger.trace(
                                "Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
                    }
                    HandlerExecutionChain handler = hm.getHandler(request);
                    if (handler != null) {
                        return handler;
                    }
                }
            }
            return null;
        }
    

    还有BeanDefinitionParserDelegate

    模板模式

    在Spring的AbstractApplicationContext.java中,refresh()是典型的模板模式,代码如下

    @Override
        public void refresh() throws BeansException, IllegalStateException {
            synchronized (this.startupShutdownMonitor) {
                // Prepare this context for refreshing.
                //1.调用容器准备刷新的方法,获取容器的当时时间,同时给容器设置同步标志
                prepareRefresh();
    
                // Tell the subclass to refresh the internal bean factory.
                //2.告诉子类启动refreshBeanFactory()方法,Bean定义资源文件的载入,从子类的refreshBeanFactory()方法启动
                ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    
                // Prepare the bean factory for use in this context.
                //3.为BeanFactory配置容器特性,例如类加载器、事件处理等
                prepareBeanFactory(beanFactory);
    
                try {
                    // Allows post-processing of the bean factory in context subclasses.
                    postProcessBeanFactory(beanFactory);
    
                    // Invoke factory processors registered as beans in the context.
                    invokeBeanFactoryPostProcessors(beanFactory);
    
                    // Register bean processors that intercept bean creation.
                    registerBeanPostProcessors(beanFactory);
    
        
    

    还有JdbcTemplate、HttpServlet

    适配器模式

    兼容转换头,如AdvisorAdapter、HandlerAdapter

        boolean supportsAdvice(Advice advice);
        MethodInterceptor getInterceptor(Advisor advisor);
    

    装饰器模式

    包装,同宗同源,如BufferdReader、InputStream、OutputStream、HttpHeadResponseDecorator

    public class BufferedReader extends Reader {
    
    //...
        public BufferedReader(Reader in, int sz) {
            super(in);
            if (sz <= 0)
                throw new IllegalArgumentException("Buffer size <= 0");
            this.in = in;
            cb = new char[sz];
            nextChar = nChars = 0;
        }
    

    观察者模式

    任务完成时通知,如ContextLoaderListener

    相关文章

      网友评论

          本文标题:设计模式总结

          本文链接:https://www.haomeiwen.com/subject/wzlctctx.html