容許一個對象在其內部狀態改變時改變它的行爲。對象看起來彷佛修改了它的類。java
狀態對象(Objects for States)設計模式
狀態模式將每個條件分支放入到一個獨立的類中,這使得你能夠根據對象自身的狀況將對象狀態做爲一個對象,這一對象能夠不依賴於其它對象而獨立變化,這樣能夠經過多態來去除多的,重複的if-else等分支語句。ide
State模式將全部與一個特定的狀態相關的行爲都放入一個狀態對象中,它提供了一個更好的方法來組織與特定狀態相關的代碼,將繁瑣的狀態判斷轉換爲結構清晰的狀態類族,再避免代碼膨脹的同時也保證了可擴展性與可維護性。this
增長了系統類和對象的個數。spa
電視的狀態分爲開機和關機狀態,開機能夠進行頻道切換,調整音量等操做,可是這時重複開機鍵是無效的;關機狀態下,頻道切換,調整音量,關機都是無效的操做,只有按開機鍵會生效。設計
/** * 電視不一樣狀態下的相同抽象行爲接口 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/15 23:30 */ public interface TvState { /** * 音量調高 */ void turnOn(); /** * 音量調低 */ void turnOff(); /** * 下一個頻道 */ void nextChannel(); /** * 上一個頻道 */ void preChannel(); } /** * 關機狀態下的行爲實現 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/15 23:22 */ public class PowerOffState implements TvState { @Override public void turnOn() { // 沒有實現即失靈 } @Override public void turnOff() { // 沒有實現即失靈 } @Override public void nextChannel() { // 沒有實現即失靈 } @Override public void preChannel() { // 沒有實現即失靈 } } /** * 開機狀態下的行爲實現 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/15 23:22 */ public class PowerOnState implements TvState { @Override public void turnOn() { System.out.println("音量調高"); } @Override public void turnOff() { System.out.println("音量調低"); } @Override public void nextChannel() { System.out.println("切換到了下一個頻道"); } @Override public void preChannel() { System.out.println("切換到了上一個頻道"); } } /** * 電視機遙控器類 * @author newtrekWang * @email wangjiaxing20160101@gmail.com * @time 2018/8/15 23:29 */ public class TvController { private TvState state; public void powerOn(){ this.state = new PowerOnState(); System.out.println("已開機"); } public void powerOff(){ this.state = new PowerOffState(); System.out.println("已關機"); } public void turnOn() { state.turnOn(); } public void turnOff() { state.turnOff(); } public void nextChannel() { state.nextChannel(); } public void preChannel() { state.preChannel(); } }
後更code
好比應用在已登陸狀態,點擊評論,會正常彈出評論框,而未登陸狀態下,則是要跳轉到登陸界面登陸後,再正常評論。對象
因此已登陸和未登陸狀態下的評論行爲是不一樣的,這個就能夠用狀態模式設計。接口