zoukankan      html  css  js  c++  java
  • Mybatis ResolverUtil的设计概念

    设计模式原则之开放-封闭原则

      程序扩展对外开放,修改对外封闭

    ResolverUtil

    其中有一个接口、两个内部类,Class对象和Annotation对象被封装成了Test对象

    Test

    两个实现类,核心功能是匹配Class类型

    IsA

    public static class IsA implements Test {
        private Class<?> parent;
    
        /** Constructs an IsA test using the supplied Class as the parent class/interface. */
        public IsA(Class<?> parentType) {
          this.parent = parentType;
        }
    
        /** Returns true if type is assignable to the parent type supplied in the constructor. */
        @Override
        public boolean matches(Class<?> type) {
          return type != null && parent.isAssignableFrom(type);
        }
    
        @Override
        public String toString() {
          return "is assignable to " + parent.getSimpleName();
        }
    }

    AnnotatedWith

    public static class AnnotatedWith implements Test {
        private Class<? extends Annotation> annotation;
    
        /** Constructs an AnnotatedWith test for the specified annotation type. */
        public AnnotatedWith(Class<? extends Annotation> annotation) {
          this.annotation = annotation;
        }
    
        /** Returns true if the type is annotated with the class provided to the constructor. */
        @Override
        public boolean matches(Class<?> type) {
          return type != null && type.isAnnotationPresent(annotation);
        }
    
        @Override
        public String toString() {
          return "annotated with @" + annotation.getSimpleName();
        }
    }

    使用

    String packageName = "com/wjz/mybatis/type/scan";
    ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<Class<?>>();
    resolverUtil.find(new ResolverUtil.IsA(CommonService.class), packageName);
    Set<Class<? extends Class<?>>> handlerSet = resolverUtil.getClasses();

    如此设计

    我们可以实现Test接口,传参find方法时传入,而不用修改ResolverUtil的内部方法。

    package com.wjz.mybatis.type.scan;
    
    import org.apache.ibatis.io.ResolverUtil.Test;
    
    public class Testtest implements Test {
    
        @Override
        public boolean matches(Class<?> type) {
            if (type == Testtest.class) {
                return true;
            }
            return false;
        }
    
    }
  • 相关阅读:
    【杂谈】对RMI(Remote Method Invoke)的认识
    【杂谈】对CopyOnWriteArrayList的认识
    【杂谈】Java I/O的底层实现
    揭开Future的神秘面纱——结果获取
    揭开Future的神秘面纱——任务执行
    【详解】ThreadPoolExecutor源码阅读(三)
    【详解】ThreadPoolExecutor源码阅读(二)
    【详解】ThreadPoolExecutor源码阅读(一)
    小程序页面数据回传
    记录一个吃过前端内存的坑
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/9905198.html
Copyright © 2011-2022 走看看