装饰器模式
# 装饰器模式
装饰器模式(Decorator Pattern)是一种结构性模式,它用于在不改变对象现有结构(方法数和方法签名都不变)的前提下向其新增功能。
# 典型应用
Mybatis 中的 org.apache.ibatis.executor.Executor
是一个典型的案例。
设想一下,如果我们是 Mybatis 的开发者,我们设计了 org.apache.ibatis.executor.Executor
接口,并添加了不同的实现类,类图如下:
此时,如果我们想要为这些 Executor 添加缓存功能,我们就可以使用装饰器模式,类图如下:
新增一个装饰类 CachingExecutor
:
- 实现
org.apache.ibatis.executor.Executor
接口 - 持有一个被装饰的
org.apache.ibatis.executor.Executor
对象,所有操作都会委托给该对象完成
这样,我们有可能在其操作之前或者之后添加额外功能,如:
public class CachingExecutor implements Executor {
private final Executor delegate;
public CachingExecutor(Executor delegate) {
this.delegate = delegate;
...
}
...
// 以 update 方法为例,在委托类执行操作之前先清空缓存
public int update(MappedStatement ms, Object parameterObject) throws SQLException {
this.flushCacheIfRequired(ms);
return this.delegate.update(ms, parameterObject);
}
...
}
# 思考
想要添加缓存功能,其实我们也可以直接修改 BaseExecutor
, 但这样做缺点很明显:
- 如果 BaseExecutor 是在第三方依赖中,则无法直接修改 BaseExecutor
- 如果有多个 BaseExecutor,则每一个都需要改
因此装饰器模式是一种较好实践。
上次更新: 2023/12/08, 06:34:37