JAVA笔记 | 快速理解策略模式且使用

目录

理解策略模式

策略模式例子

策略模式部分概念

策略模式优缺点


理解策略模式

策略模式通常用于代替代码中多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就是绝对正确的做法

你可能感兴趣的:(设计模式笔记,java,bash,开发语言,策略模式,设计模式)