描述
策略(Strategy)模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。属于对象行为模式。
主要角色
策略模式的主要角色如下。
- 抽象策略(Strategy)类:公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
代码实现
抽象策略(Strategy)类
public abstract class GameTactics {
public abstract void attackTactics();
}
public class ZoningTactics extends GameTactics{
@Override
public void attackTactics() {
System.out.println("分带策略");
}
}
public class BaoTuanTactics extends GameTactics{
@Override
public 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
- 线程池拒绝策略
……