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;
java中常用的设计模式有哪些return this;
}
public CacheBuilder clearInterval(Long clearInterval) {
this.clearInterval = clearInterval;
return this;
}
public CacheBuilder readWrite(boolean 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.Class())) { // 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
可以⽤⼀张图来表⽰这些关系和⾓⾊:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论