狀態模式-State Pattern(Java實現)

狀態模式-State Pattern

在狀態模式(State Pattern)中,類的行爲是基於它的狀態改變的。當一個對象的內在狀態改變時容許改變其行爲,這個對象看起來像是改變了其類。java

State接口

代表狀態, 實體類是根據狀態的變化而發生響應行爲的變化的.ide

/**
 * 狀態抽象定義
 */
public interface State {

    void onEnterState();

    void observe();

}

AngryState類

狀態的一種實現.this

/**
 * 生氣狀態
 */
public class AngryState implements State {

    private Mammoth mammoth;

    public AngryState(Mammoth mammoth) {
        this.mammoth = mammoth;
    }

    @Override
    public void observe() {
        System.out.printf("%s 處於暴躁狀態!\n", mammoth);
    }

    @Override
    public void onEnterState() {
        System.out.printf("%s 開始生氣了!\n", mammoth);
    }
}

PeacefulState類

狀態的一種實現.對象

/**
 * 平靜狀態
 */
public class PeacefulState implements State {

    private Mammoth mammoth;

    public PeacefulState(Mammoth mammoth) {
        this.mammoth = mammoth;
    }

    @Override
    public void observe() {
        System.out.printf("%s 如今很平靜.\n", mammoth);
    }

    @Override
    public void onEnterState() {
        System.out.printf("%s 開始冷靜下來了.\n", mammoth);
    }
}

Mammoth類

本類是狀態State的持有者blog

/**
 * 猛獁大象
 */
public class Mammoth {

    private State state;

    public Mammoth() {
        state = new PeacefulState(this);
    }

    public void timePasses() {
        if (state.getClass().equals(PeacefulState.class)) {
            changeStateTo(new AngryState(this));
        } else {
            changeStateTo(new PeacefulState(this));
        }
    }

    private void changeStateTo(State newState) {
        this.state = newState;
        this.state.onEnterState();
    }

    public void observe() {
        this.state.observe();
    }

    @Override
    public String toString() {
        return "猛獁大象";
    }
}

Main

用於模擬場景以及運行代碼接口

public class Main {

    public static void main(String[] args) {

        Mammoth mammoth = new Mammoth();
        // 看看大象如今是什麼狀態
        mammoth.observe();

        // 過了一下子
        mammoth.timePasses();

        // 看看大象如今是什麼狀態
        mammoth.observe();

        // 過了一下子
        mammoth.timePasses();

        // 看看大象如今是什麼狀態
        mammoth.observe();

    }
}

 運行結果以下:get

相關文章
相關標籤/搜索