狀態模式(封裝了基于狀態的行為,并使用委托在行為之間切換)

源碼地址 https://github.com/DingMouRen/DesignPattern
狀態模式.png
  • State定義一個或一組接口,表示該狀態下的行為
  • ConcreteState具體狀態子類,每一個具體的狀態類實現抽象State中定義的接口,從未達到不同狀態下的不同行為。
定義

狀態模式:當一個對象的內在狀態改變時允許改變其行為,對象看起來似乎修改了它的類

使用場景
  • 一個對象的行為取決于它的狀態,并且它必須在運行時根據狀態改變它的行為
  • 代碼中包含大量與對象狀態相關的條件語句
舉個栗子

我們電視機有開機和關機兩種狀態,開機狀態可以做很多,你懂的,關機狀態的話就什么也做不了。

//狀態的抽象接口類:電視狀態接口
public interface TvState {
    void nextChannel();
    void preChannel();
    void turnUp();
    void turnDown();
}

//具體狀態類:開機狀態
public class PowerOnState implements TvState {
    @Override
    public void nextChannel() {
        System.out.println(getClass().getSimpleName()+":下一個頻道");
    }

    @Override
    public void preChannel() {
        System.out.println(getClass().getSimpleName()+":上一個頻道");

    }

    @Override
    public void turnUp() {
        System.out.println(getClass().getSimpleName()+":調高音量");
    }

    @Override
    public void turnDown() {
        System.out.println(getClass().getSimpleName()+":調低音量");
    }
}
//具體狀態類:關機狀態
public class PowerOffState implements TvState{
    @Override
    public void nextChannel() {
        System.out.println("處于關機狀態,關機在屏幕上是沒有提示的哦");
    }

    @Override
    public void preChannel() {
        System.out.println("處于關機狀態,關機在屏幕上是沒有提示的哦");
    }

    @Override
    public void turnUp() {
        System.out.println("處于關機狀態,關機在屏幕上是沒有提示的哦");
    }

    @Override
    public void turnDown() {
        System.out.println("處于關機狀態,關機在屏幕上是沒有提示的哦");
    }
}

//電視遙控器
public class ControllerTv {
    private TvState tvState;//持有狀態類的引用,便于調用狀態類的方法

    //設置狀態
    private void setTvState(TvState tvState) {
        this.tvState = tvState;
    }

    //設置開機狀態
    public void powerOn(){
        setTvState(new PowerOnState());
        System.out.println("開機咯");
    }

    //設置關機狀態
    public void powerOff(){
        setTvState(new PowerOffState());
        System.out.println("關機了,歡迎再來哈");
    }

    public void nextChannel(){
        tvState.nextChannel();
    }

    public void preChannel(){
        tvState.preChannel();
    }

    public void turnUp(){
        tvState.turnUp();
    }

    public void turnDown(){
        tvState.turnDown();
    }
}

使用

    public static void main(String[] args) {
        //先獲取一個電視遙控器對象
        ControllerTv controllerTv = new ControllerTv();
        //設置開機狀態
        controllerTv.powerOn();
        //隨便玩耍
        controllerTv.nextChannel();
        controllerTv.turnUp();
        controllerTv.powerOff();
        controllerTv.nextChannel();
    }
總結

狀態模式與策略模式的結構幾乎是一樣的,但是狀態模式的行為是平行的,不可替換的;策略模式的行為是彼此獨立的,是可以相互替換的。
優點:

State模式將所有與一個特定狀態相關的行為都放入一個具體狀態對象中,提供了一個更好的方法來組織與特定狀態相關的代碼,將繁瑣的狀態判斷換成結構清晰的狀態類族,在避免代碼膨脹的同時也保證了可擴展性與可維護性。
缺點:

State模式的使用必然會增加系統類和對象的個數

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1 場景問題# 1.1 實現在線投票## 考慮一個在線投票的應用,要實現控制同一個用戶只能投一票,如果一個用戶反復...
    七寸知架構閱讀 1,974評論 7 53
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • 設計模式匯總 一、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,984評論 1 15
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,558評論 25 708
  • 《大話西游》里讓你印象最深的一句話是什么? 紫霞仙子對至尊寶說,“我只明白一件事,愛一個人是那么的痛苦!” 當時看...
    亢櫻青閱讀 977評論 4 4