mybatis 之 设计模式

Posted better_hui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis 之 设计模式相关的知识,希望对你有一定的参考价值。

目录

一、建造者模式

二、工厂模式

三、单例模式

四、代理模式

五、适配器模式

六、模板方法

七、装饰器模式

八、责任链模式


一、建造者模式

建造者模式(builder Pattern) : 使用多个简单的对象一步一步构建成一个复杂的对象。

mybatis中以Buidler结尾的对象基本上都是建造者模式。比如 SqlSessionFactoryBuilder,用以构建SqlSessionFactory对象。

mybatis中有一个很完整的构造者模式:

二、工厂模式

专门创建某种对象的工厂,对外是黑盒,我们需要getObject , 而不用关心内部实现。

mybatis中以factory结尾的类,使用的都是工厂模式。

  1. SqlSeesionFactory : 创建SqlSession对象

  2. ObjectFactory : 对象工厂

  3. MapperProxyFactory : 这是一个大佬,用来创建映射器代理对象 , MapperProxy对象

三、单例模式

单例模式(singleton pattern) 是Java中最简单常用的设计模式,一个运行中的程序,只存在一个该class的对象实体。

比如 : LogFactory 、ErrorContext

四、代理模式

代理模式(Proxy Pattern ) , 一个类代表另一个类的功能。这种类型的设计模式属于结构性模式。

mybatis的核心就是代理模式的实现,每一个mapper 都会创建一个代理类 , 每一个插件Plugin 都会创建一个代理类

五、适配器模式

适配器模式 (Adapter Pattern) 是两个不兼容对象之间的桥梁,属于是结构型模式。这种模式涉及到一个单独的类型,封装兼容加入的多个不同类型。

在mybatis中定义了Log接口,我们可以接入不同的实现,只要是符合我的Log规范即可。

 

六、模板方法

模板方法(template pattern) , 一个抽象类公开定义执行流程,允许其子类自由实现具体步骤的逻辑,属于是行为型模式。

mybatis中 ,基类 BaseExecutor , 子类SimpleExecutor 、BatchExecutor 、ReuseExecutor

// 我们以更新方法为例 , BaseExecutor中定义的通用的逻辑 , 并提供了一个doUPdate的抽象接口,由子类实现。
public int update(MappedStatement ms, Object parameter) throws SQLException 
  ErrorContext.instance().resource(ms.getResource()).activity("executing an update").object(ms.getId());
  if (closed) throw new ExecutorException("Executor was closed.");
  clearLocalCache();
  return doUpdate(ms, parameter);

​
protected abstract int doUpdate(MappedStatement ms, Object parameter)
      throws SQLException;

七、装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有对象添加新的功能,同时又不改变其原有结构,属于是结构型模式,它新建一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供额外的功能。

在Mybatis中,Cache的实现类LruCache、FifoCache等都是装饰一个类PerpetualCache。常见代码格式,就是装饰类中会有个被装饰类的属性,并且这个属性还是构造方法的参数。

public class LruCache implements Cache 
    //装饰类 持有原有类Cache的引用
  private final Cache delegate;
  private Map<Object, Object> keyMap;
  private Object eldestKey;
​
  public LruCache(Cache delegate) 
    this.delegate = delegate;
    setSize(1024);
  
    //在原有方法上扩展了cycleKeyList的逻辑
  @Override
  public void putObject(Object key, Object value) 
    delegate.putObject(key, value);
    cycleKeyList(key);
  
    

八、责任链模式

责任链模式(Chain of Responsilility Pattern) 为请求创建一个接受者对象的链。这种模式给予请求的类型,对请求的发送者和接受者解耦,属于是行为型模型。

 

public class InterceptorChain 
​
  private final List<Interceptor> interceptors = new ArrayList<Interceptor>();
    //这就是责任链
  public Object pluginAll(Object target) 
    for (Interceptor interceptor : interceptors) 
      target = interceptor.plugin(target);
    
    return target;
  

以上是关于mybatis 之 设计模式的主要内容,如果未能解决你的问题,请参考以下文章

mybatis之typehandles

聊聊Mybatis的数据源之工厂模式

MyBatis框架之适配器模式

mybatis 之 设计模式

mybatis 之 设计模式

MyBatis之执行器(Excutor)