设计模式——策略模式(Strategy Pattern)

设计模式——策略模式(Strategy Pattern),第1张

定义:策略模式又将政策模式,将算法家族提取封装起来,可以避免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配置化实现

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/756732.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-30
下一篇 2022-04-30

发表评论

登录后才能评论

评论列表(0条)

保存