一、場景
- 電梯的運行
維修、正常、自動關門、自動開門、向上運行、向下運行、消防狀態 - 紅綠燈
紅燈、黃燈、綠燈 - 企業或政府系統中公文的審批狀態
- 報銷單據審批狀態
- 假條審批
- 網上購物時,訂單的狀態
- 下單
- 已付款
- 已發貨
- 送貨中
- 已收貨
- 酒店系統中,房間的狀態變化
- 已預訂
- 已入住
- 空閑
二、核心
用于解決系統中復雜對象的狀態轉換以及不同狀態下行為的封裝問題結構:
-
Context
環境類:環境類中維護一個State
對象,他是定義了當前的狀態 -
State
抽象狀態類 -
ConcreteState
具體狀態類:每一個封裝了一個狀態對應的行為
State.java
package cn.itcast.day250.state;
//狀態的統一接口
public interface State {
public void handle();
}
FreeState.java
package cn.itcast.day250.state;
//空閑狀態子類
public class FreeState implements State {
@Override
public void handle() {
System.out.println("房屋處于空閑狀態");
}
}
BookedState.java
package cn.itcast.day250.state;
//已預訂狀態子類
public class BookedState implements State {
@Override
public void handle() {
System.out.println("房間已預訂");
}
}
CheckedInState.java
package cn.itcast.day250.state;
//已入住狀態子類
public class CheckedInState implements State {
@Override
public void handle() {
System.out.println("房間已入住");
}
}
說明:這里我們給出了一個狀態接口,接口中是一個某個狀態的行為,同時給出了三種不同的實現,分別代表三種不同的狀態及其相關的行為。
Context.java
package cn.itcast.day250.state;
//上下文類:表示當前房間的狀態,同時在不同狀態之間進行切換
public class Context {
private State state;
public void setState(State s){
System.out.println("修改狀態");
state = s;
state.handle();//調用修改后狀態的行為
}
}
說明:這是一個上下文類,這個類主要用于保存當前房間的狀態,同時完成狀態之間的切換。
Client.java
package cn.itcast.day250.state;
public class Client {
public static void main(String[] args) {
Context tx = new Context();
tx.setState(new FreeState());
}
}