当然是使用桥接模式将数据读取来源从AbstractSetting里分离出来啦
package com.itranswarp.learnjava.templatemethod; import com.itranswarp.learnjava.datasource.Source; public abstract class AbstractSetting { private Source source; public AbstractSetting(Source source) { this.source = source; } public final String getSetting(String key) { String value = lookupCache(key); if (value == null) { value = source.read(key); System.out.println("[DEBUG] load from db: " + key + " = " + value); putIntoCache(key, value); } else { System.out.println("[DEBUG] load from cache: " + key + " = " + value); } return value; } protected abstract String lookupCache(String key); protected abstract void putIntoCache(String key, String value); }
像桥接那一章创建引擎类那样创建Source类
package com.itranswarp.learnjava.datasource; public interface Source { public String read(String key); }
调用示例
Source fromFile = new FileSource(); Source fromDB = new DataBaseSource(); AbstractSetting setting1 = new LocalSetting(fromFile); System.out.println("test = " + setting1.getSetting("test")); System.out.println("test = " + setting1.getSetting("test")); AbstractSetting setting2 = new RedisSetting(); System.out.println("autosave = " + setting2.getSetting("autosave")); System.out.println("autosave = " + setting2.getSetting("autosave")); AbstractSetting setting3 = new GuavaCacheSetting(fromDB); System.out.println("test = " + setting3.getSetting("test")); System.out.println("test = " + setting3.getSetting("test"));
不过每个AbstractSetting的子类都要写一次带参构造方法继承AbstractSetting构造方法,如
public LocalSetting(Source source) { super(source); }
Source实现示例
package com.itranswarp.learnjava.datasource; public class DataBaseSource implements Source { @Override public String read(String key) { return "It's from database:" + Integer.toHexString(0x7fffffff & key.hashCode()); } }
Sign in to make a reply
SNH48-刘慈欣
当然是使用桥接模式将数据读取来源从AbstractSetting里分离出来啦
像桥接那一章创建引擎类那样创建Source类
调用示例
不过每个AbstractSetting的子类都要写一次带参构造方法继承AbstractSetting构造方法,如
Source实现示例