策略模式(Strategy)
策略模式是一种行为设计模式。
策略模式定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。使算法的变化独立于使用它们的客户端。
优点:
缺点:
Java 8 开始支持 lambda 方法, 它可作为一种替代策略模式的简单方式。
策略接口
public interface Strategy {
// 声明该算法所有变体的通用策略接口。
void evict();
}
策略实现
public class StrategyFIFO implements Strategy {
// 将算法逐一抽取到各自的类中,它们都必须实现策略接口。
@Override
public void evict() {
System.out.println("使用【先进先出】策略进行丢弃");
}
}
public class StrategyLRU implements Strategy {
@Override
public void evict() {
System.out.println("使用【最近最久未使用】策略进行丢弃");
}
}
public class StrategyLFU implements Strategy {
@Override
public void evict() {
System.out.println("使用【最近最少使用】策略进行丢弃");
}
}
Context 上下文
public class Cache {
private Map cacheData = new HashMap<>();
// 在上下文类中添加一个成员变量用于保存对于策略对象的引用。
private Strategy evictionStrategy;
// 提供设置器以修改该成员变量。
public void setEvictionStrategy(Strategy evictionStrategy) {
this.evictionStrategy = evictionStrategy;
}
// 通过策略接口同策略对象进行交互
public void evict() {
evictionStrategy.evict();
}
public void add(String value) {
// ...
}
public String get() {
// ...
return null;
}
}
测试代码
public class StrategyTest {
@Test
public void test() {
Cache cache = new Cache();
cache.add("添加");
cache.add("缓存");
cache.add("数据");
cache.setEvictionStrategy(new StrategyFIFO());
cache.get();
cache.evict();
cache.evict();
cache.setEvictionStrategy(new StrategyLRU());
cache.evict();
cache.setEvictionStrategy(new StrategyLFU());
cache.evict();
}
}
java.util.Comparator 是策略接口类
Comparator.compare() 是策略方法
Collections.sort(List list, Comparator c) 调用自定义策略
以上代码与文章会同步到 github 仓库:
/chenbihao/Design-Patterns