目录
理解策略模式
策略模式通常用于代替代码中多if的实现,避免了代码因为一个方法中if过多导致代码过长。可以理解为将不同的方法传入
策略模式例子
买了台带卡槽的游戏机,通过不同的游戏卡带,在一台游戏机上就能玩不同的游戏,这种情况可以理解为带游戏卡槽的游戏机运用了策略模式。
在未使用策略模式的时候,如果要玩不同游戏,执行不同方法,就需要在代码中,增加多个if,用于判断当前要玩那个游戏,即执行哪个逻辑。
//初代游戏机
public class OriginalGameMachine {
//初代游戏机游戏选择目录
public void gameMenue(String gameName){
if("ontra".equals(gameName)){
System.out.println("魂斗罗正在运行......");
}
if("terris".equals(gameName)){
System.out.println("俄罗斯方块正在运行......");
}
if("turtles".equals(gameName)){
System.out.println("忍者神龟正在运行......");
}
}
}
玩家对游戏机类中的gameManue()传入不同的游戏名称,来执行对应的逻辑。
//游戏玩家
public class Player {
//玩家准备玩游戏
public static void main(String[] args) {
//拿出初代游戏机
OriginalGameMachine originalGameMachine = new OriginalGameMachine();
//启动游戏机选择游戏开始
originalGameMachine.gameMenue("ontra");
originalGameMachine.gameMenue("terris");
originalGameMachine.gameMenue("turtles");
}
}
魂斗罗正在运行......
俄罗斯方块正在运行......
忍者神龟正在运行......
但是如果要新增游戏,就得改造游戏机类内部,往OriginalGameMachine类中添加新的if语句,随着游戏越来越多,if语句也越来越多,而且游戏跟游戏机也有很强的关联性,耦合性变高。于是,使用策略模式进行改造,将游戏机类与各个具体游戏分离,游戏单独做成游戏卡带(游戏方法),这样就完成了游戏跟游戏机类之间的解耦,两者可以分开维护,如果游戏机跟游戏不分开,游戏坏了或者新增游戏就得去拆游戏机,但是换成卡带,卡带坏了,游戏机还是正常的。
创建GameTape策略接口,游戏机类游戏执行方法直接接收游戏接口类型。创建具体游戏卡带类PokemonRG,PokemonXY(实现策略接口GameTape的实现类),通过插入不同的游戏卡带,进行不同的游戏。
//新版本游戏机
public class NewGameMachine {
//具有结合游戏卡带的插槽功能
public void setGameTape(GameTape gameTape){
//运行卡带中的游戏
gameTape.startGame();
}
}
//卡带-插槽
public interface GameTape {
void startGame();
}
//卡带1 口袋妖怪红绿
public class PokemonRG implements GameTape {
@Override
public void startGame() {
System.out.println("口袋妖怪红绿开始......");
}
}
//新游戏卡带 口袋妖怪XY
public class PokemonXY implements GameTape{
@Override
public void startGame() {
System.out.println("口袋妖怪XY正在运行......");
}
}
public class Player {
//玩家准备玩游戏
public static void main(String[] args) {
//拿出新版本游戏机
NewGameMachine newGameMachine = new NewGameMachine();
//玩家购买口袋妖怪红绿卡带
PokemonRG pokemonRG = new PokemonRG();
//将卡带插入游戏机开始游戏
newGameMachine.setGameTape(pokemonRG);
System.out.println("切换了游戏");
//切换卡带
newGameMachine.setGameTape(new PokemonXY());
}
}
口袋妖怪红绿开始......
切换了游戏
口袋妖怪XY正在运行......
这样就实现了游戏机跟游戏的分离,游戏机与游戏卡带各自维护,对于代码来说,减少了一个类中多if的语句,如果遇到问题只需要去具体的策略类中排查就行。对于策略接口,也起到了统一标准的的作用,规定了实现该接口的游戏类都应该实现什么方法。
策略模式部分概念
环境角色(Context) - 用来操作策略的上下文 - 玩家Player类
抽象策略角色(Strategy) - 策略方式的抽象 - 游戏卡槽-卡带 GameTape类
具体策略角色(ConcreteStrategy) - 实现抽象策略的具体策略,包装了相关算法 - 游戏PokemonRG类,PokemonXY类,不同的游戏内容
策略模式优缺点
优点:
解决代码if过多,降低业务具体实现代码跟主流程方法的耦合。且各个具体的策略实现类各自维护各自的逻辑,遇到问题时只需要排查对应的代码即可。
缺点:
如果不同的业务需求增多,策略类也会越来越多,不方便管理,且占用一定空间,所以if跟策略模式应当根据实际情况取舍,个人认为不一定用策略模式完全代替if就是绝对正确的做法