Java設(shè)計(jì)模式之狀態(tài)模式怎么實(shí)現(xiàn)

小億
92
2024-01-22 10:05:28

狀態(tài)模式是一種行為型設(shè)計(jì)模式,它允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。在狀態(tài)模式中,對(duì)象的行為是由其狀態(tài)決定的。

下面是一個(gè)簡(jiǎn)單的狀態(tài)模式的實(shí)現(xiàn)步驟:

  1. 定義一個(gè)狀態(tài)接口(State),該接口聲明了對(duì)象的行為方法。
  2. 實(shí)現(xiàn)狀態(tài)接口的具體狀態(tài)類,每個(gè)具體狀態(tài)類實(shí)現(xiàn)了狀態(tài)接口中的行為方法。
  3. 在上下文類(Context)中持有一個(gè)狀態(tài)對(duì)象,該對(duì)象可以切換不同的狀態(tài)。
  4. 在上下文類中提供一個(gè)方法(例如setState)來(lái)切換狀態(tài)。
  5. 在上下文類中根據(jù)當(dāng)前狀態(tài)調(diào)用對(duì)應(yīng)的行為方法。

下面是一個(gè)簡(jiǎn)單的Java代碼實(shí)現(xiàn):

// 定義狀態(tài)接口
interface State {
    void doAction(Context context);
}

// 實(shí)現(xiàn)具體狀態(tài)類
class StartState implements State {
    public void doAction(Context context) {
        System.out.println("Player is in start state");
        context.setState(this);
    }
}

class StopState implements State {
    public void doAction(Context context) {
        System.out.println("Player is in stop state");
        context.setState(this);
    }
}

// 上下文類
class Context {
    private State state;

    public Context() {
        state = null;
    }

    public void setState(State state) {
        this.state = state;
    }

    public State getState() {
        return state;
    }
}

// 測(cè)試代碼
public class StatePatternDemo {
    public static void main(String[] args) {
        Context context = new Context();

        StartState startState = new StartState();
        startState.doAction(context);

        StopState stopState = new StopState();
        stopState.doAction(context);
    }
}

運(yùn)行以上代碼,輸出結(jié)果為:

Player is in start state
Player is in stop state

在上面的示例中,狀態(tài)接口State定義了一個(gè)行為方法doAction,StartState和StopState是具體的狀態(tài)類,它們分別實(shí)現(xiàn)了doAction方法。上下文類Context持有一個(gè)狀態(tài)對(duì)象,可以切換不同的狀態(tài)。在測(cè)試代碼中,我們首先創(chuàng)建一個(gè)Context對(duì)象,然后創(chuàng)建一個(gè)StartState對(duì)象,并通過(guò)doAction方法將Context對(duì)象的狀態(tài)切換為StartState;然后創(chuàng)建一個(gè)StopState對(duì)象,并通過(guò)doAction方法將Context對(duì)象的狀態(tài)切換為StopState。

0