定義:
當(dāng)一個(gè)對象在其內(nèi)部狀態(tài)改變的時(shí)候改變其行為匾旭。這個(gè)對象看上去就像是改變了它的類一樣。又稱狀態(tài)對象模式圃郊,狀態(tài)模式是對象的行為模式价涝。
使用場景:
- 一個(gè)對象的行為取決于他的狀態(tài),并且他必須在運(yùn)行時(shí)根據(jù)狀態(tài)改變他的行為
- 代碼中包含大量與對象相關(guān)的條件語句持舆,例如一個(gè)操作中含有多分支語句色瘩。這些分支歷來與該對象
- 狀態(tài)模式將每一個(gè)條件分支放入一個(gè)獨(dú)立類中,這使得你可以根據(jù)對象自身的情況將狀態(tài)作為一個(gè)對象逸寓。這一對象可以不依賴于其他對象而獨(dú)立變化居兆。這樣通過過多的,重復(fù)的if-else分支語句
案例(電視劇開關(guān)機(jī) 和選擇上一個(gè)和下一個(gè)頻道)
- 抽象狀態(tài)(State)角色
//定義一個(gè)接口竹伸,用以封裝環(huán)境(Context)對象的一個(gè)特定的狀態(tài)所對應(yīng)的行為泥栖。
public interface TvState {
void nextChannel();//下一個(gè)頻道
void preChannel();//上一個(gè)頻道
void turnOn();//開機(jī)
void turnOff();//關(guān)機(jī)
}
- 具體狀態(tài)(ConcreteState)角色
每一個(gè)具體狀態(tài)類都實(shí)現(xiàn)了環(huán)境(Context)的一個(gè)狀態(tài)所對應(yīng)的行為。
//關(guān)機(jī)狀態(tài)
public class PowerOffState implements TvState {
@Override
public void nextChannel() {
System.out.print("無效"+"\n");
}
@Override
public void preChannel() {
System.out.print("無效"+"\n");
}
@Override
public void turnOn() {
System.out.print("無效"+"\n");
}
@Override
public void turnOff() {
System.out.print("關(guān)機(jī)了"+"\n");
}
}
//開機(jī)狀態(tài)下
public class PowerOnState implements TvState {
@Override
public void nextChannel() {
System.out.print("下一個(gè)頻道"+"\n");
}
@Override
public void preChannel() {
System.out.print("上一個(gè)頻道"+"\n");
}
@Override
public void turnOn() {
System.out.print("開機(jī)了"+"\n");
}
@Override
public void turnOff() {
System.out.print("關(guān)機(jī)了"+"\n");
}
}
- 環(huán)境(Context)角色
//上下文:定義客戶端所感興趣的接口佩伤,并且保留一個(gè)具體狀態(tài)類的實(shí)例聊倔。這個(gè)定義了對象的當(dāng)前狀態(tài)
public class TvControl {
TvState mTvState;
public void setState(TvState mTvState){
this.mTvState=mTvState;
}
public void powerOn(){
setState(new PowerOnState());//開機(jī)
mTvState.turnOn();
}
public void powerOff(){
setState(new PowerOffState());//關(guān)機(jī)
mTvState.turnOff();
}
public void nextChannel() {
mTvState.nextChannel();//上一個(gè)頻道
}
public void preChannel() {
mTvState.preChannel();//下一個(gè)頻道
}
public void turnOn() {
mTvState.turnOn();//開機(jī)
}
public void turnOff() {
mTvState.turnOff();//關(guān)機(jī)
}
}
- 客戶端調(diào)用
public class MyClass {
public static void main(String[] args){
TvControl tvControl=new TvControl();
tvControl.powerOn();//開機(jī)
tvControl.nextChannel();//下一個(gè)頻道
tvControl.preChannel();//上一個(gè)頻道
tvControl.powerOff();//關(guān)機(jī)
tvControl.powerOff();//關(guān)機(jī)
}
}
開機(jī)了
下一個(gè)頻道
上一個(gè)頻道
關(guān)機(jī)了
關(guān)機(jī)了