源碼地址 | https://github.com/DingMouRen/DesignPattern |
---|
狀態模式.png
- State定義一個或一組接口,表示該狀態下的行為
- ConcreteState具體狀態子類,每一個具體的狀態類實現抽象State中定義的接口,從未達到不同狀態下的不同行為。
定義
狀態模式:當一個對象的內在狀態改變時允許改變其行為,對象看起來似乎修改了它的類
使用場景
- 一個對象的行為取決于它的狀態,并且它必須在運行時根據狀態改變它的行為
- 代碼中包含大量與對象狀態相關的條件語句
舉個栗子
我們電視機有開機和關機兩種狀態,開機狀態可以做很多,你懂的,關機狀態的話就什么也做不了。
//狀態的抽象接口類:電視狀態接口
public interface TvState {
void nextChannel();
void preChannel();
void turnUp();
void turnDown();
}
//具體狀態類:開機狀態
public class PowerOnState implements TvState {
@Override
public void nextChannel() {
System.out.println(getClass().getSimpleName()+":下一個頻道");
}
@Override
public void preChannel() {
System.out.println(getClass().getSimpleName()+":上一個頻道");
}
@Override
public void turnUp() {
System.out.println(getClass().getSimpleName()+":調高音量");
}
@Override
public void turnDown() {
System.out.println(getClass().getSimpleName()+":調低音量");
}
}
//具體狀態類:關機狀態
public class PowerOffState implements TvState{
@Override
public void nextChannel() {
System.out.println("處于關機狀態,關機在屏幕上是沒有提示的哦");
}
@Override
public void preChannel() {
System.out.println("處于關機狀態,關機在屏幕上是沒有提示的哦");
}
@Override
public void turnUp() {
System.out.println("處于關機狀態,關機在屏幕上是沒有提示的哦");
}
@Override
public void turnDown() {
System.out.println("處于關機狀態,關機在屏幕上是沒有提示的哦");
}
}
//電視遙控器
public class ControllerTv {
private TvState tvState;//持有狀態類的引用,便于調用狀態類的方法
//設置狀態
private void setTvState(TvState tvState) {
this.tvState = tvState;
}
//設置開機狀態
public void powerOn(){
setTvState(new PowerOnState());
System.out.println("開機咯");
}
//設置關機狀態
public void powerOff(){
setTvState(new PowerOffState());
System.out.println("關機了,歡迎再來哈");
}
public void nextChannel(){
tvState.nextChannel();
}
public void preChannel(){
tvState.preChannel();
}
public void turnUp(){
tvState.turnUp();
}
public void turnDown(){
tvState.turnDown();
}
}
使用
public static void main(String[] args) {
//先獲取一個電視遙控器對象
ControllerTv controllerTv = new ControllerTv();
//設置開機狀態
controllerTv.powerOn();
//隨便玩耍
controllerTv.nextChannel();
controllerTv.turnUp();
controllerTv.powerOff();
controllerTv.nextChannel();
}
總結
狀態模式與策略模式的結構幾乎是一樣的,但是狀態模式的行為是平行的,不可替換的;策略模式的行為是彼此獨立的,是可以相互替換的。
優點:
State模式將所有與一個特定狀態相關的行為都放入一個具體狀態對象中,提供了一個更好的方法來組織與特定狀態相關的代碼,將繁瑣的狀態判斷換成結構清晰的狀態類族,在避免代碼膨脹的同時也保證了可擴展性與可維護性。
缺點:
State模式的使用必然會增加系統類和對象的個數