Discuss / Java / 思考如果既可以扩展缓存,又可以扩展底层存储,会不会出现子类数量爆炸的情况?如何解决?

思考如果既可以扩展缓存,又可以扩展底层存储,会不会出现子类数量爆炸的情况?如何解决?

Topic source

当然是使用桥接模式将数据读取来源从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());
	}

}

  • 1

Reply