概念

策略模式:Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. 定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端。
策略模式用于解耦策略的定义、创建、使用三部分。
常见的应用场景是避免冗长的 if-else 或 switch 分支判断。也能像模板方法一样,提供框架扩展点。

示例

定义

public interface Strategy {
void algorithmInterface();
}
public class ConcreteStrategyA implements Strategy {
@Override
public void algorithmInterface() {
//具体的算法…
}
}
public class ConcreteStrategyB implements Strategy {

}

创建

public class StrategyFactory {
private static final Map strategies = new HashMap<>();
static {
strategies.put(“A”, new ConcreteStrategyA());
strategies.put(“B”, new ConcreteStrategyB());
}
public static Strategy getStrategy(String type) {
if (type == null || type.isEmpty()) {
throw new IllegalArgumentException(“type should not be empty.”);
}
return strategies.get(type);
}
}
对于无状态的策略类,可以使用上面的方式,事先创建好策略实例。如果是有状态的,则需要每次新创建策略实例。

使用

// 策略接口:EvictionStrategy
// 策略类:LruEvictionStrategy、FifoEvictionStrategy、LfuEvictionStrategy…
// 策略工厂:EvictionStrategyFactory
// 运行时动态确定,根据配置文件的配置决定使用哪种策略
public class Application {
public static void main(String[] args) throws Exception {
EvictionStrategy evictionStrategy = null;
Properties props = new Properties();
props.load(new FileInputStream(“./config.properties”));
String type = props.getProperty(“eviction_type”);
evictionStrategy = EvictionStrategyFactory.getEvictionStrategy(type);
UserCache userCache = new UserCache(evictionStrategy);
//…
}
}