状态模式

title

状态模式(State Pattern)是一种行为型设计模式,它允许一个对象在其内部状态发生改变时改变其行为,看起来就像是这个对象改变了其类。

状态模式中包含以下角色:

  • 环境(Context):定义客户端所需要的接口,并维护一个当前状态对象。
  • 抽象状态(State):定义一个接口,用于封装与环境的一个特定状态相关的行为。
  • 具体状态(Concrete State):实现抽象状态接口,包含与该状态相关的行为。

假设有一个游戏类(Game),游戏有三种状态:游戏开始状态(StartState)、游戏进行中状态(PlayingState)和游戏结束状态(EndState)。在游戏开始状态下,玩家可以选择开始游戏,进入游戏进行中状态;在游戏进行中状态下,玩家可以继续游戏或者退出游戏;在游戏结束状态下,玩家只能选择退出游戏。

以下是使用状态模式的示例代码:

// 环境类
public class Game {
    private State state;

    public Game() {
        this.state = new StartState();
    }

    public void setState(State state) {
        this.state = state;
    }

    public void play() {
        state.play(this);
    }
}

// 抽象状态类
public interface State {
    void play(Game game);
}

// 游戏开始状态
public class StartState implements State {
    @Override
    public void play(Game game) {
        System.out.println("游戏开始,进入游戏进行中状态");
        game.setState(new PlayingState());
    }
}

// 游戏进行中状态
public class PlayingState implements State {
    @Override
    public void play(Game game) {
        System.out.println("游戏进行中...");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请选择:1-继续游戏,2-退出游戏");
        int choice = scanner.nextInt();
        if (choice == 1) {
            System.out.println("继续游戏");
        } else if (choice == 2) {
            System.out.println("退出游戏");
            game.setState(new EndState());
        } else {
            System.out.println("无效选择");
        }
    }
}

// 游戏结束状态
public class EndState implements State {
    @Override
    public void play(Game game) {
        System.out.println("游戏已结束,无法继续游戏");
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        Game game = new Game();

        game.play();  // 输出:游戏开始,进入游戏进行中状态
        game.play();  // 输出:游戏进行中...
                      //      请选择:1-继续游戏,2-退出游戏
                      //      1
                      //      继续游戏
        game.play();  // 输出:游戏进行中...
                      //      请选择:1-继续游戏,2-退出游戏
                      //      2
                      //      退出游戏
        game.play();  // 输出:游戏已结束,无法继续游戏
    }
}

在上述代码中,Game 是环境类,包含了当前游戏状态的状态对象 State。游戏状态有三种,分别是 StartState、PlayingState 和 EndState,它们都实现了 State 接口中的 play() 方法。每个状态对象的 play() 方法中,通过调用环境类 Game 的 setState() 方法来改变当前状态。最后,通过在 Main 类中调用 Game 的 play() 方法,模拟了玩家对游戏的不同操作。

powered by Gitbook© 2023 编外计划 | 最后修改: 2023-11-24 03:37:01

results matching ""

    No results matching ""