定义:策略模式又将政策模式,将算法家族提取封装起来,可以避免if...else...和switch语句大量出现在我们代码中,属于行为型模式。
适用场景:
- 假如系统中有很多类,而这些类的区别仅仅在于他们的行为不同。
- 一个系统需要动态地在几种算法中动态切换选择一种。
- 需要屏蔽算法规则。
优点:
- 符合开闭原则
- 避免代码内部逻辑臃肿复杂
- 避免使用多重条件判断语句
- 使用策略模式可以提高内部逻辑的安全性和保密性
缺点:
- 代码中会增加很多类,结构变得复杂
- 客户端必须知道所有的策略,并且自行选择
private void mockMethod(String key) {
if ("A".equals(key)) {
// execute Strategy A logic
} else if ("B".equals(key)) {
// execute Strategy B logic
} else {
// execute default Strategy logic
}
}
使用策略模式后代码
声明策略接口
public interface IStrategy {
void execute();
}
几种不同策略
public class DefaultStrategy implements IStrategy {
@Override
public void execute() {
// execute default Strategy logic
}
}
public class StrategyA implements IStrategy {
@Override
public void execute() {
// execute Strategy A logic
}
}
public class StrategyB implements IStrategy {
@Override
public void execute() {
// execute Strategy B logic
}
}
生成策略的工厂类
public class StrategyFactory {
private static final Map STRATEGIES = new HashMap<>();
private static final IStrategy defaultStrategy = new DefaultStrategy();
static {
STRATEGIES.put(StrategyKey.KEY_E, defaultStrategy);
STRATEGIES.put(StrategyKey.KEY_A, new StrategyA());
STRATEGIES.put(StrategyKey.KEY_B, new StrategyB());
}
private StrategyFactory() {}
public static IStrategy getStrategy(String strategyKey) {
IStrategy strategy = STRATEGIES.get(strategyKey);
return null!=strategy ? strategy : defaultStrategy;
}
private interface StrategyKey {
static final String KEY_E = "E";
static final String KEY_A = "A";
static final String KEY_B = "B";
}
}
对外调用
private void enhanceMethod(String key) {
IStrategy strategy = StrategyFactory.getStrategy(key);
strategy.execute();
}
对比以上使用策略前和使用策略后的代码结构,可以发现,使用策略模式后类变多,结构变复杂了,所以如果逻辑很简单的情况,不需要使用策略模式,否则反而让代码变得复杂,代码量变多。当不同条件走不同逻辑,每个逻辑都很复杂的情况,建议使用策略模式来将不同逻辑分开,使代码变得美观清晰,逼格大大提高。
策略模式在框架中的使用Spring框架中bean的初始化就采用了策略模式
InstantiationStrategy, SimpleInstantiationStrategy, CglibSubclassingInstantiationStrategy面试题
什么场景下应该用策略模式?什么场景下不该用?
适合的场景:
经常需要自由切换执行逻辑和规则,而逻辑和规则相对比较稳定,不容易变化的场景
不适合的场景:
如果两种逻辑之间关联性很大,而且变化也比较快,可以通过configuration配置化实现
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)