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;
        }
    
    }
  • 相关阅读:
    (转)CSS3之pointer-events(屏蔽鼠标事件)属性说明
    Linux下source命令详解
    控制台操作mysql常用命令
    解决beego中同时开启http和https时,https端口占用问题
    有关亚马逊云的使用链接收集
    favicon.ico--网站标题小图片二三事
    网络博客
    Gitbook 命令行工具
    Markdown 轻量级标记语言
    SVN 集中式版本控制系统
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/9905198.html
Copyright © 2011-2022 走看看