Catch
V1
2022/04/16阅读:39主题:全栈蓝
设计模式之策略模式
有人说策略模式的作用是避免 if-else 分支判断逻辑。实际上,这种认识是很片面的。策略模式主要的作用还是解耦策略的定义、创建和使用,控制代码的复杂度,让每个部分都不至于过于复杂、代码量过多。除此之外,对于复杂代码来说,策略模式还能让其满足开闭原则,添加新策略的时候,最小化、集中化代码改动,减少引入 bug 的风险。
定义
定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。
策略类的定义比较简单,包含一个策略接口和一组实现这个接口的策略类。因为所有的策略类都实现相同的接口,所以,客户端代码基于接口而非实现编程,可以灵活地替换不同的策略。
应用场景
-
需要在不同情况下使用不同的策略(算法) -
对客户隐藏具体策略(算法)的实现细节,彼此完全独立
类图
下图中IdStrategyFactory
工厂类和IdStrategy.Type
枚举类并不是必须的。

代码实现
IdStrategy
public interface IdStrategy {
String getId();
public enum Type {
UUID, SNOW_FLAKE;
}
}
UuidStrategy
public class UuidStrategy implements IdStrategy {
@Override
public String getId() {
return UUID.randomUUID().toString();
}
}
SnowFlakeStrategy
public class SnowFlakeStrategy implements IdStrategy {
@Override
public String getId() {
// 雪花算法...
return "SnowFlakeId";
}
}
IdStrategyFactory
public class IdStrategyFactory {
private static Map<IdStrategy.Type, IdStrategy> strategyMap = new HashMap<>();
static {
strategyMap.put(IdStrategy.Type.UUID, new UuidStrategy());
strategyMap.put(IdStrategy.Type.SNOW_FLAKE, new SnowFlakeStrategy());
}
public IdStrategy get(IdStrategy.Type type) {
return strategyMap.get(type);
}
}
Main
public class Main {
public static void main(String[] args) {
String id;
IdStrategy strategy;
strategy = new UuidStrategy();
id = strategy.getId();
System.out.println(id);
strategy = new SnowFlakeStrategy();
id = strategy.getId();
System.out.println(id);
// 结合工厂模式
IdStrategyFactory factory = new IdStrategyFactory();
strategy = factory.get(IdStrategy.Type.UUID);
id = strategy.getId();
System.out.println(id);
strategy = factory.get(IdStrategy.Type.SNOW_FLAKE);
id = strategy.getId();
System.out.println(id);
}
}
作者介绍
Catch
V1