设计模式 20:状态模式
定义与目的
- 定义 :状态模式允许一个
对象
在其内部状态改变时改变它的行为。对象
看起来像是改变了它的类
。 - 目的 :该模式的主要目的是根据
对象
的状态改变其行为,使得对象
在不同的状态下有不同的行为表现。
实现示例
假设我们有一个简单的游戏,玩家可以通过收集金币来升级,我们可以使用状态模式来实现这个需求。
java
// 抽象状态
interface PlayerState {
void onEnter(Player player);
void collectCoin(Player player);
void onExit(Player player);
}
// 具体状态 - 新手
class NoviceState implements PlayerState {
@Override
public void onEnter(Player player) {
player.setScore(0);
}
@Override
public void collectCoin(Player player) {
if (player.getScore() >= 10) {
player.setState(new IntermediateState());
} else {
player.setScore(player.getScore() + 1);
}
}
@Override
public void onExit(Player player) {
System.out.println("Leaving novice state.");
}
}
// 具体状态 - 中级
class IntermediateState implements PlayerState {
@Override
public void onEnter(Player player) {
System.out.println("Entering intermediate state.");
}
@Override
public void collectCoin(Player player) {
if (player.getScore() >= 20) {
player.setState(new AdvancedState());
} else {
player.setScore(player.getScore() + 2);
}
}
@Override
public void onExit(Player player) {
System.out.println("Leaving intermediate state.");
}
}
// 具体状态 - 高级
class AdvancedState implements PlayerState {
@Override
public void onEnter(Player player) {
System.out.println("Entering advanced state.");
}
@Override
public void collectCoin(Player player) {
player.setScore(player.getScore() + 3);
}
@Override
public void onExit(Player player) {
System.out.println("Leaving advanced state.");
}
}
// 上下文 - 玩家
class Player {
private PlayerState state;
private int score;
public Player() {
setState(new NoviceState());
}
public void setState(PlayerState state) {
if (this.state != null) {
this.state.onExit(this);
}
this.state = state;
state.onEnter(this);
}
public void collectCoin() {
state.collectCoin(this);
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Player player = new Player();
player.collectCoin(); // 收集一枚金币
player.collectCoin(); // 收集第二枚金币
player.collectCoin(); // 收集第三枚金币
player.collectCoin(); // 收集第四枚金币
player.collectCoin(); // 收集第五枚金币
player.collectCoin(); // 收集第六枚金币
player.collectCoin(); // 收集第七枚金币
player.collectCoin(); // 收集第八枚金币
player.collectCoin(); // 收集第九枚金币
player.collectCoin(); // 收集第十枚金币
}
}
使用场景
- 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时。
- 当状态转换的逻辑很复杂时。
- 当一个操作中含有庞大的条件语句,并且这些条件取决于对象的状态时。
状态模式通过允许一个对象在其内部状态改变时改变它的行为,使得对象在不同的状态下有不同的行为表现。这对于需要根据对象状态动态改变行为的场景非常有用。
小结
状态模式是一种常用的行为型模式,它可以帮助你根据对象的状态改变其行为,使得对象在不同的状态下有不同的行为表现。这对于需要根据对象状态动态改变行为的场景非常有用。