本文来自廖雪峰,郎涯进行简单排版与补充
模板方法,即Template Method是一种高层定义骨架,底层实现细节的设计模式,适用于流程固定,但某些步骤不确定或可替换的情况。
假设我们开发了一个从数据库读取设置的类: 由于从数据库读取数据较慢,我们可以考虑把读取的设置缓存起来,这样下一次读取同样的key就不必再访问数据库了。但是怎么实现缓存,暂时没想好,先声明抽象方法就可以:
public abstract class AbstractSetting {
public final String getSetting(String key) {
String value = lookupCache(key);
if (value == null) {
value = readFromDatabase(key);
putIntoCache(key, value);
}
return value;
}
protected abstract String lookupCache(String key);
protected abstract void putIntoCache(String key, String value);
}
子类其实并不关心核心代码getSetting(key)
的逻辑,它只需要关心如何完成两个小小的子任务就可以了。
假设我们希望用一个Map
做缓存,那么可以写一个LocalSetting
:
public class LocalSetting extends AbstractSetting {
private Map<String, String> cache = new HashMap<>();
protected String lookupCache(String key) {
return cache.get(key);
}
protected void putIntoCache(String key, String value) {
cache.put(key, value);
}
}
如果我们要使用Redis做缓存,那么可以再写一个RedisSetting
:
客户端代码使用本地缓存的代码这么写:
AbstractSetting setting1 = new LocalSetting();
System.out.println("test = " + setting1.getSetting("test"));
System.out.println("test = " + setting1.getSetting("test"));
要改成Redis缓存,只需要把LocalSetting
替换为RedisSetting
即可
Java标准库也有很多模板方法的应用。