mybatis中使用到的设计模式

Mybatis中使用到了哪些设计模式呢?下面就简单的来介绍下:

1.构造者模式:

构造者模式是在mybatis初始化mapper映射文件的过程中,为<cache>节点创建Cache对象的方式就是构造者模式。其中CacheBilder为建造者角色,Cache对象是产品角色,可以看CacheBuilder的源码来理解:

// 该类就是构造者
public
class CacheBuilder {
// 这几个属性就是为生成产品对象需要的字段
private String id; private Class<? extends Cache> implementation; private List<Class<? extends Cache>> decorators; private Integer size; private Long clearInterval; private boolean readWrite; private Properties properties; public CacheBuilder(String id) { this.id = id; this.decorators = new ArrayList<Class<? extends Cache>>(); } // 以下这几个方法就是构造者在生成产品对象时,需要使用到的几个具体模块方法。可以根据这几个方法的不同组合,生成不同的Cache对象 public CacheBuilder implementation(Class<? extends Cache> implementation) { this.implementation = implementation; return this; } public CacheBuilder addDecorator(Class<? extends Cache> decorator) { if (decorator != null) { this.decorators.add(decorator); } return this; } public CacheBuilder size(Integer size) { this.size = size; return this; } public CacheBuilder clearInterval(Long clearInterval) { this.clearInterval = clearInterval; return this; } public CacheBuilder readWrite(boolean readWrite) { this.readWrite = readWrite; return this; } public CacheBuilder properties(Properties properties) { this.properties = properties; return this; } // 这个方法就是构造者生成产品的具体方法 返回的Cahce对象就是产品角色 public Cache build() { setDefaultImplementations(); Cache cache = newBaseCacheInstance(implementation, id); setCacheProperties(cache); if (PerpetualCache.class.equals(cache.getClass())) { // issue #352, do not apply decorators to custom caches for (Class<? extends Cache> decorator : decorators) { cache = newCacheDecoratorInstance(decorator, cache); setCacheProperties(cache); } cache = setStandardDecorators(cache); } return cache; } }

 2 装饰器模式

Cache接口的实现有多个,但是大部分都是装饰器,只有PerpetualCache提供了Cache接口的基本实现,其他的装饰器都是在PerpetualCache的基础上提供了一些额外的功能,通过各种组合后满足一个特定的需求。如图:

 

先看下被装饰者PerpetualCache的源码部分:

  private String id; // cache对象的唯一标识
  // 底层使用HashMap来保存缓存信息 
  private Map<Object, Object> cache = new HashMap<Object, Object>();

  public PerpetualCache(String id) {
    this.id = id;
  }

  public String getId() {
    return id;
  }

  public int getSize() {
    return cache.size();
  }

  public void putObject(Object key, Object value) {
    cache.put(key, value);
  }

然后再看LruCache这个装饰器:

  private final Cache delegate; // 被装饰的底层cache对象
  private Map<Object, Object> keyMap; // LinkedHashMap 用于记录key最近的使用情况
  private Object eldestKey; // 记录最少被使用的缓存项的key

  public LruCache(Cache delegate) {
    this.delegate = delegate;
    setSize(1024);
  }

3 工厂方法模式

mybatis中DataSource的创建使用了工厂方法模式,那么有哪些类在该模式中扮演了哪些角色呢?

工厂接口(Factory):DataSourceFactory扮演工厂接口角色

具体工厂类(ConcreteFactory):UnpooledDataSourceFactory和PooledDataSourceFactory

产品接口角色(Product):java.sql.DataSource

具体产品类角色(ConcreteFactory):UnpooledDataSource和PooledDataSource

可以用一张图来表示这些关系和角色:

 

posted @ 2018-09-21 08:50  51life  阅读(9165)  评论(0编辑  收藏  举报