描述
策略(Strategy)模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。属于对象行为模式。
主要角色
策略模式的主要角色如下。
- 抽象策略(Strategy)类:公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
代码实现
抽象策略(Strategy)类public abstract class GameTactics {public abstract void attackTactics();}
public class ZoningTactics extends GameTactics{@Overridepublic void attackTactics() {System.out.println("分带策略");}}
public class BaoTuanTactics extends GameTactics{@Overridepublic void attackTactics() {System.out.println("5人抱团啦");}}
public class GameStart {private GameTactics gameTactics;public void setGameTactics(GameTactics gameTactics) {this.gameTactics = gameTactics;}public void startTheGame(){System.out.println("开始游戏=》使用进攻策略");gameTactics.attackTactics();}}
public class TacticsTest {public static void main(String[] args) {GameStart gameStart = new GameStart();gameStart.setGameTactics(new BaoTuanTactics());gameStart.startTheGame();System.out.println("切换进攻策略啦=》》》");gameStart.setGameTactics(new ZoningTactics());gameStart.startTheGame();}}//测试结果开始游戏=》使用进攻策略5人抱团啦切换进攻策略啦=》》》开始游戏=》使用进攻策略分带策略
使用场景
什么场景用到?
- 使用策略模式可以避免使用多重条件语句,
- 如 if…else 语句、switch…case 语句
- 什么是Spring的 InstantiationStrategy
- 线程池拒绝策略
……
