更多設計模式文章請閱讀:
1、定義:
當一個對象的內在狀態發生改變時允許改變其行爲,這個對象看起來改變了其類
2、描述:
狀態模式中行爲是由狀態決定的,不同的狀態有不同的行爲,狀態模式的意圖是讓一個對象在其內部狀態改變的時候,其行爲也隨之改變。
3、應用場景
一個對象是有狀態的
這個對象在不同的狀態時,行爲不一樣
狀態可以切換
4、UML建模圖
Context :環境類,定義客戶興趣的接口,維護了一個State子類的實例,這個實例定義了對象的當前狀態
State :抽象狀態類或者狀態接口,定義一個或者一組接口,表示該狀態下的行爲
ConcreteStateA 、ConcreteStateB:具體狀態類,每一個具體的狀態類實現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();
}
}
運行結果:
不能評論,沒有登錄,跳到登錄頁面
切換註銷狀態
評論成功!
轉發成功!
切換註銷狀態
不能轉發,沒有登錄,跳到登錄頁面