概念

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

主要角色

  • 环境类(Context)角色:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。
  • 抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。
  • 具体状态(Concrete State)角色:实现抽象状态所对应的行为,并且在需要的情况下进行状态切换。 ```java /**
    • 抽象状态(State)角色 */ public interface TeamState {
  1. //玩游戏
  2. void playGame();
  3. //切换到下一个状态
  4. 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();
    }
}

应用场景

  • 策略模式和状态模式是一样的?
  • 状态模式核心需要具体状态类能在必要的时候切换状态
  • 流程框架与状态机