委派模式不屬于GOF23種設計模式, 主要角色有三種: 抽象任務角色, 委派者角色, 具體任務角色。
委派模式具體是指定義一個抽象接口, 它有若幹實作類, 他們真正執行業務方法, 這些子類是具體任務角色。定義委派者角色也實作該接口, 但它負責在各個具體角色執行個體之間做出決策, 由它判斷并調用具體實作的方法。聯想到工作中就是leader将任務分派給小組長,小組長進行任務具體拆分到個人。
通常委派模式對外隐藏了具體實作, 僅将委派者角色暴露給外部。是不是立馬想到了外觀?如果委派者和具體的ConcreteTask也暴露出去可以嗎?
我們可以看下示意圖
也就是說Delegate與ConcreteTask是同一種類型,實作了同樣的方法。在委派者處理任務時,會将具體任務動作分派給ConcreteTask。
我們來看下一種變異的委派模式-mybatis中的CachingExecutor
如下所示,CachingExecutor 的構造方法中擁有delegate對象(這裡可以了解為執行工作任務的對象)。
public class CachingExecutor implements Executor {
private final Executor delegate;
private final TransactionalCacheManager tcm = new TransactionalCacheManager();
public CachingExecutor(Executor delegate) {
this.delegate = delegate;
delegate.setExecutorWrapper(this);
}
}
@Override
public int update(MappedStatement ms, Object parameterObject) throws SQLException {
flushCacheIfRequired(ms);
return delegate.update(ms, parameterObject);
}