java面试设计模式_java面试合集(设计模式)

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

1.构造者模式:

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

// 该类就是构造者

public class CacheBuilder {

// 这几个属性就是为生成产品对象需要的字段

private String id;

private Class extends Cache> implementation;

private List> decorators;

private Integer size;

private Long clearInterval;

private boolean readWrite;

private Properties properties;

public CacheBuilder(String id) {

this.id = id;

this.decorators = new ArrayList>();

}

// 以下这几个方法就是构造者在生成产品对象时,需要使用到的几个具体模块方法。可以根据这几个方法的不同组合,生成不同的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;

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

2 装饰器模式

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

84fbaa832e00fa841036dca147d17496.png

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

private String id; // cache对象的唯一标识

// 底层使用HashMap来保存缓存信息

private Map cache = new HashMap();

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);

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

然后再看LruCache这个装饰器:

48304ba5e6f9fe08f3fa1abda7d326ab.png

private final Cache delegate; // 被装饰的底层cache对象

private Map keyMap; // LinkedHashMap 用于记录key最近的使用情况

private Object eldestKey; // 记录最少被使用的缓存项的key

public LruCache(Cache delegate) {

this.delegate = delegate;

setSize(1024);

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

3 工厂方法模式

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

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

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

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

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

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

12858a77c06268039ef46cd015d04a0b.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值