【設計模式】(二十九)--行爲型模式--狀態模式

【設計模式】(二十九)–行爲型模式–狀態模式

狀態模式定義

Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.

意思是:當一個對象內在狀態改變時允許改變行爲,這個對象看起來像改變了其類型。
對象的行爲依賴於它的狀態(屬性),並且可以根據它的狀態改變而改變它的相關行爲。
狀態模式基於以下三個元素:

  • State 抽象狀態類,封裝了一個狀態和狀態對應的行爲接口。
  • Concrete State 具體狀態類,實現了行爲接口。
  • Context 環境類,定義了外部需要的接口,持有一個狀態對象,並且負責切換具體的狀態以及行爲調用。

狀態模式的優點

  • 1、封裝了轉換規則。
  • 2、枚舉可能的狀態,在枚舉狀態之前需要確定狀態種類。
  • 3、將所有與某個狀態有關的行爲放到一個類中,並且可以方便地增加新的狀態,只需要改變對象狀態即可改變對象的行爲。
  • 4、允許狀態轉換邏輯與狀態對象合成一體,而不是某一個巨大的條件語句塊。 5、可以讓多個環境對象共享一個狀態對象,從而減少系統中對象的個數。

但是使用狀態模式會產生很多子類,不易管理。

狀態模式的使用場景

  • 1、行爲隨狀態改變而改變的場景。
  • 2、條件、分支語句的代替者。

狀態模式的簡單實現

類圖
在這裏插入圖片描述
實現

public class Test {
    public static void main(String[] args) {
        TV tv = new TV();
        tv.start();
        tv.changeDFTV();
        tv.changeZJTV();
        tv.changeHNTV();
    }
}
/**
 * 電視
 */
public class TV {
    private final static Channel ZJTV = new ZJTV();
    private final static Channel DFTV = new DFTV();
    private final static Channel HNTV = new HNTV();

    private Channel channel;

    public void setChannel(Channel channel) {
        this.channel = channel;
    }

    public void changeZJTV() {
        System.out.println("切換節目");
        this.setChannel(ZJTV);
        this.channel.display();
    }

    public void changeDFTV() {
        System.out.println("切換節目");
        this.setChannel(DFTV);
        this.channel.display();
    }

    public void changeHNTV() {
        System.out.println("切換節目");
        this.setChannel(HNTV);
        this.channel.display();
    }

    public void start() {
        System.out.println("開機,初始節目");
        Channel initChannel = HNTV;
        this.setChannel(initChannel);
        this.channel.display();
    }
}
/**
 * 頻道
 */
public interface Channel {
    /**
     * 展示節目
     */
    void display();
}
/**
 * 湖南衛視
 */
public class HNTV implements Channel {
    @Override
    public void display() {
        System.out.println("湖南衛視:我是歌手!");
    }
}
/**
 * 浙江衛視
 */
public class ZJTV implements Channel {
    @Override
    public void display() {
        System.out.println("浙江衛視:奔跑吧!兄弟!");
    }
}
/**
 * 東方衛視
 */
public class DFTV implements Channel {
    @Override
    public void display() {
        System.out.println("東方衛視:極限挑戰");
    }
}

結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章