开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22 天,点击查看活动详情
觉得对你有益的小伙伴记得点个赞+关注
后续完整内容持续更新中
希望一起交流的欢迎发邮件至javalyhn@163.com
1. 策略模式的定义
策略模式定义了一系列算法
,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
2. 策略模式的角色定义
- 抽象策略(Strategy)类:
公共接口
,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
具体策略(Concrete Strategy)类:
实现了抽象策略定义的接口,提供具体的算法实现。环境(Context)类:
持有一个策略类的引用,最终给客户端调用。
3. 策略模式使用场景
- 使用策略模式可以避免使用多重条件语句,如 if...else 语句、switch...case 语句
- 什么是Spring的
InstantiationStrategy
- 线程池拒绝策略
4. 策略模式的实现
我们给定以下游戏策略场景
MainTest
public class MainTest {
public static void main(String[] args) {
TeamGNR gnr = new TeamGNR();
gnr.setGameStrategy(new RandomStrategy());
gnr.startGame();
}
}
UziStrategy
/**
* 冲锋向前策略
*/
public class UziStrategy implements GameStrategy{
@Override
public void warStrategy() {
System.out.println("uzi.....");
}
}
TeamGNR
/**
* 环境类
*/
public class TeamGNR {
//抽取游戏策略算法,并进行引用
private GameStrategy gameStrategy;
public void setGameStrategy(GameStrategy gameStrategy) {
this.gameStrategy = gameStrategy;
}
public void startGame(){
System.out.println("游戏开始.....");
//游戏策略
gameStrategy.warStrategy();
System.out.println("win......");
}
}
SteadyStrategy
/**
* 稳健运营策略
*/
public class SteadyStrategy implements GameStrategy {
@Override
public void warStrategy() {
System.out.println("各路小心...及时支援...");
}
}
RandomStrategy
public class RandomStrategy implements GameStrategy{
@Override
public void warStrategy() {
System.out.println("大乱斗...");
}
}
GameStrategy
/**
* 游戏策略
*/
public interface GameStrategy {
//战斗策略
void warStrategy();
}
5. 总结
策略模式简而言之就是根据所给的不同策略,通过将自己定义的各类实现交给策略实现类来实现。 就是说你想让环境类做什么,告诉他策略就行。由此,大量的ifelse判断和switchcase语句就可以减少很多了。