解决问题
将算法按照策略或场景封装起来,以方便按照不同的场景执行不同的策略。它很好的解决了通过if...else 来决策行为而带来的代码和逻辑复杂性。
应用场景
一个经常被拿来举例的场景是收银员收银场景:它需要根据不同的场景(是否为会员、有无促销等)来决定计算方式,如果使用if..else将使得代码复杂的无法维护,这时我们就可以分场景来计算即可。
所以该策略的应用场景即为:需要根据场景执行不同的策略(该策略应该具有一定的复杂性)
模式图UML
-
Context:即场景,持有一个或多个策略
-
Strategy: 即策略,具有一个执行策略的方法
-
ConcreteStrategy:具体策略
示例
举一个实际工作中的例子吧。APP在改版时通常需要做ABTest,A/B策略展式的样式会有所不同。
- Strategy
public interface Strategy { public void show(); } 复制代码
- Concrete
public class StrategyA implements Strategy { @Override public void show() { System.out.println("展示促销"); } }public class StrategyB implements Strategy{ @Override public void show() { System.out.println("展示广告"); } }复制代码
- Context
@AllArgsConstructor public class Context { private Strategy strategy; // 可能还有其它信息 public void showPattern() { strategy.show(); } }复制代码
- client
public class Client { public static void main(String[] args) { String a = "a";// getStrategy from rpc Strategy strategy; if (a.equals("a")) { strategy = new StrategyA(); } else { strategy = new StrategyB(); } new Context(strategy).showPattern(); } }复制代码
参考
https://en.wikipedia.org/wiki/Strategy_pattern