zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    【bzoj1300】大数计算器
    BZOJ3192: [JLOI2013]删除物品
    BZOJ2818: Gcd
    BZOJ2440: [中山市选2011]完全平方数
    BZOJ3994: [SDOI2015]约数个数和
    BZOJ2154: Crash的数字表格
    BZOJ3529: [Sdoi2014]数表
    BZOJ2301: [HAOI2011]Problem b
    BZOJ1562: [NOI2009]变换序列
    BZOJ1059: [ZJOI2007]矩阵游戏
  • 原文地址:https://www.cnblogs.com/51life/p/9543280.html
Copyright © 2011-2022 走看看