狀態模式-State Pattern 在狀態模式(State Pattern)中,類的行為是基於它的狀態改變的。當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。 State介面 表明狀態, 實體類是根據狀態的變化而發生響應行為的變化的. AngryState類 狀態的一種實現 ...
狀態模式-State Pattern
在狀態模式(State Pattern)中,類的行為是基於它的狀態改變的。當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。
State介面
表明狀態, 實體類是根據狀態的變化而發生響應行為的變化的.
/** * 狀態抽象定義 */ public interface State { void onEnterState(); void observe(); }
AngryState類
狀態的一種實現.
/** * 生氣狀態 */ public class AngryState implements State { private Mammoth mammoth; public AngryState(Mammoth mammoth) { this.mammoth = mammoth; } @Override public void observe() { System.out.printf("%s 處於暴躁狀態!\n", mammoth); } @Override public void onEnterState() { System.out.printf("%s 開始生氣了!\n", mammoth); } }
PeacefulState類
狀態的一種實現.
/** * 平靜狀態 */ public class PeacefulState implements State { private Mammoth mammoth; public PeacefulState(Mammoth mammoth) { this.mammoth = mammoth; } @Override public void observe() { System.out.printf("%s 現在很平靜.\n", mammoth); } @Override public void onEnterState() { System.out.printf("%s 開始冷靜下來了.\n", mammoth); } }
Mammoth類
本類是狀態State的持有者
/** * 猛獁大象 */ public class Mammoth { private State state; public Mammoth() { state = new PeacefulState(this); } public void timePasses() { if (state.getClass().equals(PeacefulState.class)) { changeStateTo(new AngryState(this)); } else { changeStateTo(new PeacefulState(this)); } } private void changeStateTo(State newState) { this.state = newState; this.state.onEnterState(); } public void observe() { this.state.observe(); } @Override public String toString() { return "猛獁大象"; } }
Main
用於模擬場景以及運行代碼
public class Main { public static void main(String[] args) { Mammoth mammoth = new Mammoth(); // 看看大象現在是什麼狀態 mammoth.observe(); // 過了一會兒 mammoth.timePasses(); // 看看大象現在是什麼狀態 mammoth.observe(); // 過了一會兒 mammoth.timePasses(); // 看看大象現在是什麼狀態 mammoth.observe(); } }
運行結果如下: