在狀態模式(State Pattern)中,類的行爲是基於它的狀態改變的。當一個對象的內在狀態改變時容許改變其行爲,這個對象看起來像是改變了其類。java
代表狀態, 實體類是根據狀態的變化而發生響應行爲的變化的.ide
/** * 狀態抽象定義 */ public interface State { void onEnterState(); void observe(); }
狀態的一種實現.this
/** * 生氣狀態 */ 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); } }
狀態的一種實現.對象
/** * 平靜狀態 */ 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); } }
本類是狀態State的持有者blog
/** * 猛獁大象 */ 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 "猛獁大象"; } }
用於模擬場景以及運行代碼接口
public class Main { public static void main(String[] args) { Mammoth mammoth = new Mammoth(); // 看看大象如今是什麼狀態 mammoth.observe(); // 過了一下子 mammoth.timePasses(); // 看看大象如今是什麼狀態 mammoth.observe(); // 過了一下子 mammoth.timePasses(); // 看看大象如今是什麼狀態 mammoth.observe(); } }
運行結果以下:get