概念
- 对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

主要角色
- 环境类(Context)角色:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。
- 抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。
- 具体状态(Concrete State)角色:实现抽象状态所对应的行为,并且在需要的情况下进行状态切换。
```java
/**
- 抽象状态(State)角色 */ public interface TeamState {
//玩游戏void playGame();//切换到下一个状态TeamState next();
}
```java
/**
* 吃牛肉面状态
*/
public class BeafNodleState implements TeamState {
@Override
public void playGame() {
System.out.println("饱饱的一顿牛肉面......中了诅咒,输了");
}
@Override
public TeamState next() {
return new MatchState();
}
}
/**
* 竞赛状态
*/
public class MatchState implements TeamState{
@Override
public void playGame() {
System.out.println("全力以赴打比赛....");
}
//状态模式的核心
@Override
public TeamState next() {
return new VocationState();
}
}
/**
* 休假状态
*/
public class VocationState implements TeamState {
@Override
public void playGame() {
System.out.println("三亚旅游真舒服....饿了...不玩游戏");
//状态流转
}
@Override
public TeamState next() {
return new BeafNodleState();
}
}
/**
* 环境类:
*/
public class SKTTeam {
private TeamState teamState;
public void setTeamState(TeamState teamState) {
this.teamState = teamState;
}
//开始游戏
public void startGame(){
//状态不同会导致不同的游戏结果
teamState.playGame();
}
//下一个状态
void nextState(){
teamState = teamState.next();
}
}
/**
* 状态切换
*/
public class MainTest {
public static void main(String[] args) {
SKTTeam sktTeam = new SKTTeam();
TeamState state = new VocationState();
sktTeam.setTeamState(state);
sktTeam.startGame();
sktTeam.startGame();
sktTeam.nextState();
sktTeam.startGame();
sktTeam.nextState();
sktTeam.startGame();
// state = state.next();
// sktTeam.setTeamState(state);
// sktTeam.startGame();
//
//
// //状态需要维护自己的切换逻辑
// state = state.next();
// sktTeam.setTeamState(state);
// sktTeam.startGame();
}
}
应用场景
- 策略模式和状态模式是一样的?
- 状态模式核心需要具体状态类能在必要的时候切换状态
- 流程框架与状态机
