描述

策略(Strategy)模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。属于对象行为模式。
image.png

主要角色

策略模式的主要角色如下。

  • 抽象策略(Strategy)类:公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
  • 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

代码实现

  1. 抽象策略(Strategy)类
  2. public abstract class GameTactics {
  3. public abstract void attackTactics();
  4. }
  1. public class ZoningTactics extends GameTactics{
  2. @Override
  3. public void attackTactics() {
  4. System.out.println("分带策略");
  5. }
  6. }
  1. public class BaoTuanTactics extends GameTactics{
  2. @Override
  3. public void attackTactics() {
  4. System.out.println("5人抱团啦");
  5. }
  6. }
  1. public class GameStart {
  2. private GameTactics gameTactics;
  3. public void setGameTactics(GameTactics gameTactics) {
  4. this.gameTactics = gameTactics;
  5. }
  6. public void startTheGame(){
  7. System.out.println("开始游戏=》使用进攻策略");
  8. gameTactics.attackTactics();
  9. }
  10. }
  1. public class TacticsTest {
  2. public static void main(String[] args) {
  3. GameStart gameStart = new GameStart();
  4. gameStart.setGameTactics(new BaoTuanTactics());
  5. gameStart.startTheGame();
  6. System.out.println("切换进攻策略啦=》》》");
  7. gameStart.setGameTactics(new ZoningTactics());
  8. gameStart.startTheGame();
  9. }
  10. }
  11. //测试结果
  12. 开始游戏=》使用进攻策略
  13. 5人抱团啦
  14. 切换进攻策略啦=》》》
  15. 开始游戏=》使用进攻策略
  16. 分带策略

使用场景

什么场景用到?

  • 使用策略模式可以避免使用多重条件语句,
  • 如 if…else 语句、switch…case 语句
  • 什么是Spring的 InstantiationStrategy
  • 线程池拒绝策略

……