Skip to content

Latest commit

 

History

History
57 lines (40 loc) · 1.88 KB

File metadata and controls

57 lines (40 loc) · 1.88 KB

本文来自廖雪峰,郎涯进行简单排版与补充

模板方法,即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标准库也有很多模板方法的应用。