狀態模式也叫做狀態機模式,運行對象在內部狀態發生改變時改變它的行爲,對象看起來好像修改了它的類,屬於行爲型設計模式。算法
狀態模式中類的行爲是由狀態決定的,在不一樣的狀態下有不一樣的行爲。其意圖是讓一個對象在其內部改變的時候,行爲也隨之改變。設計模式
狀態模式的核心是裝態與行爲綁定,不一樣的狀態對應不一樣的行爲。架構
狀態模式的UML類圖就不畫了,由於它和策略模式的UML類圖基本一致,它們都包含三個角色,ide
其中環境類角色(Context)分別是負責切換策略和狀態,抽象角色分別是定義不一樣策略和不一樣狀態測試
的行爲,具體角色分別是策略的具體實現和狀態的具體實現,惟一的區別是狀態模式在完成某個狀態this
的行爲以後還有可能會切換到其餘狀態。spa
當咱們瀏覽博客園的文章時,若是咱們以爲文章很好,忍不住想評論、收藏。可是若是咱們處於未登陸的狀態,就會自動跳轉到登陸頁面設計
這裏涉及到的狀態有兩種登陸和未登陸,行爲有評論和收藏。下面使用狀態模式來實現這個邏輯,代碼以下。code
首先建立抽象狀態角色類,定義評論和收藏兩個行爲對象
public abstract class UserState { protected AppContext context; public void setContext(AppContext context) { this.context = context; } public abstract void favorite(); public abstract void comment(String comment); }
而後建立未登陸狀態類,定義在未登陸狀態下,兩種行爲的具體實現
public class UnLoginState extends UserState { @Override public void favorite() { this.switch2login(); this.context.getState().favorite(); } @Override public void comment(String comment) { this.switch2login(); this.context.getState().comment(comment); } private void switch2login(){ System.out.println("跳轉到登陸頁!"); this.context.setState(this.context.STATE_LOGIN); } }
建立登陸狀態類,定義在登陸狀態下,兩種行爲的具體實現
public class LoginState extends UserState { @Override public void favorite() { System.out.println("收藏成功!"); } @Override public void comment(String comment) { System.out.println(comment); } }
建立上下文角色類,根據登陸狀態切換具體的行爲
public class AppContext { public static final UserState STATE_LOGIN = new LoginState(); public static final UserState STATE_UNLOGIN = new UnLoginState(); private UserState currentState = STATE_UNLOGIN; { STATE_LOGIN.setContext(this); STATE_UNLOGIN.setContext(this); } public void setState(UserState state){ this.currentState = state; } public UserState getState(){ return this.currentState; } public void favorite(){ this.currentState.favorite(); } public void comment(String comment){ this.currentState.comment(comment); } }
最後編寫客戶端測試代碼。
public class Test { public static void main(String[] args) { AppContext context = new AppContext(); context.favorite(); context.comment("評論:好文章,360個贊"); } }
狀態模式和策略模式的UML類圖架構幾乎徹底同樣,但二者的應用場景是不同的。策略模式的多種算法行爲則其一都能知足,彼此之間是獨立的,用戶可自行更換策略算法;而
狀態模式的各個狀態之間存在相互關係,彼此之間必定的條件下存在自動切換的效果,而且用戶沒法指定狀態,只能設置初始狀態,由於狀態是根據行爲而改變的。