解決問題
將算法按照策略或場景封裝起來,以方便按照不同的場景執(zhí)行不同的策略。它很好的解決了通過if...else 來決策行為而帶來的代碼和邏輯復(fù)雜性。
應(yīng)用場景
一個經(jīng)常被拿來舉例的場景是收銀員收銀場景:它需要根據(jù)不同的場景(是否為會員、有無促銷等)來決定計(jì)算方式,如果使用if..else將使得代碼復(fù)雜的無法維護(hù),這時我們就可以分場景來計(jì)算即可。
所以該策略的應(yīng)用場景即為:需要根據(jù)場景執(zhí)行不同的策略(該策略應(yīng)該具有一定的復(fù)雜性)
模式圖UML
image
Context:即場景,持有一個或多個策略
Strategy: 即策略,具有一個執(zhí)行策略的方法
ConcreteStrategy:具體策略
示例
舉一個實(shí)際工作中的例子吧。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();
}
}