設計模式(八)狀態模式


更多設計模式文章請閱讀:

設計模式專欄

1、定義:

當一個對象的內在狀態發生改變時允許改變其行爲,這個對象看起來改變了其類

2、描述:

狀態模式中行爲是由狀態決定的,不同的狀態有不同的行爲,狀態模式的意圖是讓一個對象在其內部狀態改變的時候,其行爲也隨之改變。

3、應用場景

一個對象是有狀態的
這個對象在不同的狀態時,行爲不一樣
狀態可以切換

4、UML建模圖

在這裏插入圖片描述

Context :環境類,定義客戶興趣的接口,維護了一個State子類的實例,這個實例定義了對象的當前狀態
State :抽象狀態類或者狀態接口,定義一個或者一組接口,表示該狀態下的行爲
ConcreteStateAConcreteStateB:具體狀態類,每一個具體的狀態類實現State中定義的接口,從而實現達到不同狀態的不同行爲。

5、簡單示例:

以抖音轉發和評論功能作爲示例

當用戶評論或者轉發的時候需要驗證用戶登錄狀態,若是登錄狀態,則可以直接進行評論和轉發,若沒有登錄,則跳轉到登錄頁面


/**
 * 用戶行爲
 */
public interface UserState {

    /**
     * 評論功能
     */
    void commont();

    /**
     * 轉發功能
     */
    void forward();
}

/**
 * 登錄狀態行爲
 */
public class LoginState implements UserState {
    @Override
    public void commont() {
        System.out.println("評論成功!");
    }

    @Override
    public void forward() {
        System.out.println("轉發成功!");
    }
}

/**
 * 註銷狀態行爲
 */
public class LogOutState implements UserState {
    @Override
    public void commont() {

        System.out.println("不能評論,沒有登錄,跳到登錄頁面");
    }

    @Override
    public void forward() {
        System.out.println("不能轉發,沒有登錄,跳到登錄頁面");
    }
}

狀態持有

public class LoginContext implements UserState {

    UserState mState=new LogOutState();

    static LoginContext sLoginContext=new LoginContext();


    public static LoginContext getInstance(){
        return sLoginContext;
    }

    public void setState(UserState state){
        if (state instanceof LoginState ) {
            System.out.println("切換登錄狀態");
        }else{
            System.out.println("切換註銷狀態");
        }
        mState=state;
    }

    @Override
    public void commont() {
        mState.commont();
    }

    @Override
    public void forward() {
        mState.forward();
    }
}

public class Test {

    public static void main(String[] args){

        LoginContext.getInstance().commont();

        //登錄成功
        LoginContext.getInstance().setState(new LoginState());
        LoginContext.getInstance().commont();
        LoginContext.getInstance().forward();

        //註銷成功
        LoginContext.getInstance().setState(new LogOutState());
        LoginContext.getInstance().forward();

    }
}

運行結果:

不能評論,沒有登錄,跳到登錄頁面
切換註銷狀態
評論成功!
轉發成功!
切換註銷狀態
不能轉發,沒有登錄,跳到登錄頁面
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章