状态模式
状态模式(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() 方法,模拟了玩家对游戏的不同操作。