解決問題
將算法按照策略或場景封裝起來,以方便按照不同的場景執行不同的策略。它很好的解決了通過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