解決問題
為避免重復代碼及屏蔽復雜的算法邏輯,將相同的代碼抽象出一個模板,差異化的client端實現abstract方法。
應用場景
Template模式應該是我們最常用到的一種模式。在工作過程中,我們經常會遇到需要對一些行為進行封裝的操作,而template模式因為簡單性則成為首先的一種方式。而我們經常使用的一些包,也有很多使用了Template模式,如JDBC。
模式圖UML
image
AbstractClass 用來抽象邏輯和公共代碼
SubClass1 用來實現差異化行為
示例
場景:為了提高響應速度和減輕后臺服務的壓力,前端請求的數據我們通常會先訪問緩存,如果緩存不存在,我們再請求數據庫或者是遠程RPC服務。可是緩存有多種memcache, redis等,遠程服務有可能是數據庫、http接口、thrift接口等。但我不希望為每一個種緩存和RPC都寫一遍這個邏輯,那么我們就可以使用template模式。
AbstractClass
public abstract class DataService {
public Data getData() {
Data data = getDataFromCache();
if (data == null) {
return this.getDataFromRpc();
}
return null;
}
protected abstract Data getDataFromRpc();
protected abstract Data getDataFromCache();
}
subclass
public class XxDataService extends DataService {
@Override
protected Data getDataFromRpc() {
// 具體細節
return new Data();
}
@Override
protected Data getDataFromCache() {
// 具體細節
return new Data();
}
public static void main(String[] args) {
new XxDataService().getData();
}
}