MyBatis源码中装饰器模式
MyBatis中关于Cache和CachingExecutor接口的实现类也使用了装饰者设计模式。Executor是MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护;CachingExecutor是一个Executor的装饰器,给一个Executor增加了缓存的功能。此时可以看做是对Executor类的一个增强,故使用装饰器模式是合适的。
2.1.1 Executor
首先我们看下Executor,打开MyBatis的源码org.apache.ibatis.session.Configuration
public Executor newExecutor(Transaction transaction, ExecutorType executorType) {executorType = executorType == null ? defaultExecutorType : executorType;executorType = executorType == null ? ExecutorType.SIMPLE : executorType;Executor executor;if (ExecutorType.BATCH == executorType) {executor = new BatchExecutor(this, transaction);} else if (ExecutorType.REUSE == executorType) {executor = new ReuseExecutor(this, transaction);} else {executor = new SimpleExecutor(this, transaction);}//如果开启了二级缓存则装饰原先的Executorif (cacheEnabled) {executor = new CachingExecutor(executor);}executor = (Executor) interceptorChain.pluginAll(executor);return executor;}
2.1.2 CachingExecutor (装饰器的具体实现对象)
public class CachingExecutor implements Executor {//持有组件对象private Executor delegate;private TransactionalCacheManager tcm = new TransactionalCacheManager();//构造方法,传入组件对象public CachingExecutor(Executor delegate) {this.delegate = delegate;delegate.setExecutorWrapper(this);}@Overridepublic int update(MappedStatement ms, Object parameterObject) throws SQLException {//转发请求给组件对象,可以在转发前后执行一些附加动作flushCacheIfRequired(ms);return delegate.update(ms, parameterObject);}//...}
