天天看點

STATE PATTERN(狀态)模式描述實作适用場景優點缺點相關模式

文章目錄

  • 描述
    • 定義
    • 類型
    • 動機
    • UML類圖
    • 時序圖
  • 實作
    • 主要角色
    • 示例
  • 适用場景
  • 優點
  • 缺點
  • 相關模式
STATE PATTERN(狀态)模式描述實作适用場景優點缺點相關模式

描述

定義

允許一個對象在其内部狀态改變時改變它的行為,對象看起來似乎修改了它的類。

類型

對象行為型模式

動機

對象的行為依賴于它的狀态(屬性),并且可以根據它的狀态改變而改變它的相關行為。

UML類圖

STATE PATTERN(狀态)模式描述實作适用場景優點缺點相關模式

時序圖

STATE PATTERN(狀态)模式描述實作适用場景優點缺點相關模式

實作

主要角色

  • Context:上下文
    • 定義客戶感興趣的接口。
    • 維護一個ConcreteState子類的執行個體,這個執行個體定義目前狀态。
  • State:狀态接口類
    • 定義一個接口以封裝與Context的一個特定狀态相關的行為。
  • ConcreteState:具體狀态類
    • 每一子類實作一個與Context的一個狀态相關的行為。

示例

  • Context:上下文。誰定義狀态轉換:如果規則是固定的,那麼可在Context中完全實作。然而若讓State子類自身指定後繼狀态以及何時進行轉換,通常更靈活更合适,但缺點是在各子類之間産生了實作依賴。
    public class Context {
         private State state;
    
         public Context(State state) {
            this.state = state;
         }
       
         public State getState() {
            return state;
         }
    
         public void changeState() {
      	  this.state = this.state.next();
         }
    
         public void request() {
            state.handle(this); 
         }
      }
               
  • State:狀态接口類。建立和銷毀State對象通常有兩種做法:1) 僅當需要State對象時才建立它們并随後銷毀它們;2) 提前建立它們并且始終不銷毀它們。
    interface State {
         void handle(Context context);
         State next();
      }
               
  • ConcreteState:具體狀态類
    public class ConcreteState1 implements State {
         @override
         public void next() {
            return new ConcreteState2();
         }
    
         @override
         public void handle(Context context) {
            System.out.println("ConcreteState1");
         }
      }
    
      public class ConcreteState2 implements State {
         @override
         public void next() {
            return new ConcreteState1();
         }
    
         @override
         public void handle(Context context) {
            System.out.println("ConcreteState2");
         }
      }
               
  • Client:客戶類
    public class Client {
          public static void main(String[] args) {
              Context context = new Context(new ConcreteState1());
      		context.request();
      		context.changeState();
      		context.request();
          }
      }
               

适用場景

  • 對象的行為随它的狀态改變而改變,并且它必須在運作時刻動态決定。
  • 條件、分支語句的代替者。一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀态。

優點

  • 将與特定狀态相關的行為局部化,并且将不同狀态的行為分割開來。
  • 封裝了轉換規則。通過定義新的子類可以很容易的增加新的狀态和轉換。
  • 使得狀态轉換顯式化。為不同的狀态引入獨立的對象使得轉換變得更加明确。而且可保證狀态轉換是原子的。
  • 狀态對象可被共享。如果State對象沒有執行個體變量——即它們表示的狀态完全以它們的類型來編碼——那麼各Context對象可以共享一個State對象。

缺點

  • 會增加系統類和對象的個數。
  • 對"開閉原則"的支援不太好。增加新的狀态類需要修改那些負責狀态轉換的源代碼,而且修改某個狀态類的行為也需修改對應類的源代碼。

相關模式

  • Flyweight:通過享元模式來實作何時以及怎樣共享狀态對象。
  • Singleton:狀态對象通常是單例。

繼續閱讀