策略模式-Strategy Pattern
2018-06-08 本文已影响9人
oneWeekOneTopic
解决问题
将算法按照策略或场景封装起来,以方便按照不同的场景执行不同的策略。它很好的解决了通过if...else 来决策行为而带来的代码和逻辑复杂性。
应用场景
一个经常被拿来举例的场景是收银员收银场景:它需要根据不同的场景(是否为会员、有无促销等)来决定计算方式,如果使用if..else将使得代码复杂的无法维护,这时我们就可以分场景来计算即可。
所以该策略的应用场景即为:需要根据场景执行不同的策略(该策略应该具有一定的复杂性)
模式图UML
image-
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();
}
}