解决问题
为避免重复代码及屏蔽复杂的算法逻辑,将相同的代码抽象出一个模板,差异化的client端实现abstract方法。
应用场景
Template模式应该是我们最常用到的一种模式。在工作过程中,我们经常会遇到需要对一些行为进行封装的操作,而template模式因为简单性则成为首先的一种方式。而我们经常使用的一些包,也有很多使用了Template模式,如JDBC。
模式图UML
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();
}
}