1. 程式人生 > 實用技巧 >java23種設計模式-行為型模式-狀態模式

java23種設計模式-行為型模式-狀態模式

一、定義

狀態(State)模式的定義:對有狀態的物件,把複雜的“判斷邏輯”提取到不同的狀態物件中,允許狀態物件在其內部狀態發生改變時改變其行為。

二、優點及缺點

優點:

1、結構清晰,狀態模式將與特定狀態相關的行為區域性化到一個狀態中,並且將不同狀態的行為分割開來,滿足“單一職責原則”。

2、將狀態轉換顯示化,減少物件間的相互依賴。將不同的狀態引入獨立的物件中會使得狀態轉換變得更加明確,且減少物件間的相互依賴。

3、狀態類職責明確,有利於程式的擴充套件。通過定義新的子類很容易地增加新的狀態和轉換。

缺點:

1、狀態模式的使用必然會增加系統的類與物件的個數。

2、狀態模式的結構與實現都較為複雜,如果使用不當會導致程式結構和程式碼的混亂。

3、狀態模式對開閉原則的支援並不太好,對於可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的原始碼,否則無法切換到新增狀態,而且修改某個狀態類的行為也需要修改對應類的原始碼。

三、程式碼實現:

環境類:

package zhuangtaimoshi;

/**
 *  @Author: caesar
 *  @Date:2020年12月05日 16:12:00
 *  @Description: 環境類
 */
public class Context {
    // 狀態類
    private State state;
    // 初始化狀態類
    public Context(){
        
this.state = new StateA(); } // get和set public State getState() { return state; } public void setState(State state) { this.state = state; } // 處理請求 public void handle(){ this.state.Handle(this); } }

狀態抽象類:

package zhuangtaimoshi;

/**
 *  @Author: caesar
 *  @Date:2020年12月05日 16:12:19
 *  @Description: 抽象狀態類
 
*/ public abstract class State { public abstract void Handle(Context context); }

狀態實現類A:

package zhuangtaimoshi;

/**
 *  @Author: caesar
 *  @Date:2020年12月05日 18:12:04
 *  @Description: 狀態類A
 */
public class StateA extends State{
    @Override
    public void Handle(Context context) {
        System.out.println("這是狀態A");
        context.setState(new StateB());
    }
}

狀態實現類B:

package zhuangtaimoshi;

/**
 *  @Author: caesar
 *  @Date:2020年12月05日 16:12:16
 *  @Description: 狀態類B
 */
public class StateB extends State{
    @Override
    public void Handle(Context context) {
        System.out.println("這是狀態B");
        context.setState(new StateA());
    }
}

測試類:

package zhuangtaimoshi;

/**
 *  @Author: caesar
 *  @Date:2020年12月05日 18:12:02
 *  @Description: 測試類
 */
public class Test {
    public static void main(String[] args) {
        StateB stateB = new StateB();
        Context context = new Context();
        context.handle();
        context.handle();
        context.setState(stateB);
        context.handle();
    }
}

四、原始碼級別

五、總結

主要解決:當一個物件的行為取決於它的狀態,並且它必須在執行時根據狀態改變它的行為時,就可以考慮使用狀態模式。一個操作中含有龐大的分支結構,並且這些分支決定於物件的狀態時。