狀態模式初學

狀態模式

定義: 狀態模式允許對象在內部狀態改變時改變它的行爲,實例化的對象看起來好像修改了它的類。

當代碼中包含大量與對象狀態有關的條件語句時,或行爲隨狀態改變而改變的場景,就可以用狀態模式去解決。

狀態,顧名思義,就是狀態。。,可以表示一個類中的狀態,也不僅僅是狀態,也包括行爲的。

比如飛機的三種狀態:沒有動力,沒在飛行,正在飛行。

在這裏插入圖片描述

基本結構

狀態模式的類圖如下:

在這裏插入圖片描述

從結構上看,主要就是將項目中變化的部分抽出來,提煉出狀態接口後,然後將各個狀態抽去,並去實現接口,每個狀態都有相應的行爲,但是做法不一樣。

基本使用

以上面說的飛機狀態爲例,首先還是創建接口。

public interface State {
    public void fly();
    public void stopfly();
    public void up();
    public void down();
}

然後是具體狀態實現類

public class StateFlying implements State {
    @Override
    public void fly() {
        System.out.println("alread flying");
    }
    @Override
    public void stopfly() {
        System.out.println("stopflying");
    }
    @Override
    public void up() {
        System.out.println("start up ...");
    }
    @Override
    public void down() {
        System.out.println("start down ...");
    }
}

最後Context類去使用上面的類

public class PlaneContext {
    private State state;
    public PlaneContext() {
        state = null;
    }
    public void setState(State state) {
        this.state = state;
    }
    public void fly() {
        System.out.println("PlaneContext: fly");
        this.state.fly();
    }
    ...
}
buttonrd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                planeContext.setState(stateNotPower);
                test();
                Toast.makeText(MainActivity.this, "測試無動力狀態", Toast.LENGTH_SHORT).show();
            }

最後使用時,直接在mainactivity中,去setstate不同的具體狀態類,即可調用到相應的方法。

這樣最大的好處就是沒有那些if…else之類的語句了,也方便擴展。

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