概念
??狀態(tài)模式,就是和對(duì)象的 狀態(tài)相關(guān)的行為型模式。根據(jù)狀態(tài)的不同,類的行為也不同。
角色
抽象狀態(tài)類:定義了狀態(tài)類的通用方法。
具體狀態(tài)類:實(shí)現(xiàn)抽象狀態(tài)類。
環(huán)境類:提供當(dāng)前的狀態(tài)和狀態(tài)管理。
上代碼
抽象狀態(tài)類
public interface State {
void doAction(Context context);
}
具體狀態(tài)類
??這里實(shí)現(xiàn)后,把當(dāng)前的狀態(tài)設(shè)置給Context,用于表示當(dāng)前的狀態(tài)已經(jīng)改變。
public class StudyState implements State{
@Override
public void doAction(Context context) {
System.out.println("Study");
context.setState(this);
}
@Override
public String toString() {
return "Study State";
}
}
public class RestState implements State{
@Override
public void doAction(Context context) {
System.out.println("Rest");
context.setState(this);
}
@Override
public String toString() {
return "Rest State";
}
}
環(huán)境類
public class Context {
private State state;
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
測(cè)試類
public class StateClient {
public static void main(String[] args) {
Context context = new Context();
StudyState state = new StudyState();
RestState reState = new RestState();
state.doAction(context);
System.out.println(context.getState().toString());
reState.doAction(context);
System.out.println(context.getState().toString());
}
}

The End
??這樣就完成了一個(gè)簡(jiǎn)單的狀態(tài)模式了,感覺和策略模式有點(diǎn)像,但是狀態(tài)模式更著重于當(dāng)前對(duì)象的狀態(tài)。
優(yōu)缺點(diǎn):
優(yōu)點(diǎn): 1、封裝了轉(zhuǎn)換規(guī)則。 2、枚舉可能的狀態(tài),在枚舉狀態(tài)之前需要確定狀態(tài)種類。 3、將所有與某個(gè)狀態(tài)有關(guān)的行為放到一個(gè)類中,并且可以方便地增加新的狀態(tài),只需要改變對(duì)象狀態(tài)即可改變對(duì)象的行為。 4、允許狀態(tài)轉(zhuǎn)換邏輯與狀態(tài)對(duì)象合成一體,而不是某一個(gè)巨大的條件語(yǔ)句塊。 5、可以讓多個(gè)環(huán)境對(duì)象共享一個(gè)狀態(tài)對(duì)象,從而減少系統(tǒng)中對(duì)象的個(gè)數(shù)。
缺點(diǎn): 1、狀態(tài)模式的使用必然會(huì)增加系統(tǒng)類和對(duì)象的個(gè)數(shù)。 2、狀態(tài)模式的結(jié)構(gòu)與實(shí)現(xiàn)都較為復(fù)雜,如果使用不當(dāng)將導(dǎo)致程序結(jié)構(gòu)和代碼的混亂。 3、狀態(tài)模式對(duì)"開閉原則"的支持并不太好,對(duì)于可以切換狀態(tài)的狀態(tài)模式,增加新的狀態(tài)類需要修改那些負(fù)責(zé)狀態(tài)轉(zhuǎn)換的源代碼,否則無(wú)法切換到新增狀態(tài),而且修改某個(gè)狀態(tài)類的行為也需修改對(duì)應(yīng)類的源代碼。
??暫時(shí)先寫這么多吧,等后面有新的體會(huì)了再繼續(xù)。