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;
        }
    
    }
  • 相关阅读:
    在Visual Studio 2015中引用DLL的3种方法
    在Qt中使用大漠插件
    wprintf、wcout无法输出中文的解决方案
    在安卓6.0(及以上)设备上无法获取无线网卡MAC地址的解决方案
    使用Java绘制验证码
    adb常用命令整理
    Java中数组复制的几种方式以及数组合并
    在Qt Creator中为Qt工程添加资源
    使用POCO发送HTTP(S)请求
    使用Qt发送HTTPS请求
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/9905198.html
Copyright © 2011-2022 走看看