在組件構建過程中,某些對象的狀態經常面臨變化,如何對這些變化進行有效的管理?同時又維持高層模塊的穩定?“狀態變化”模式為這一問題提供了一種解決方案。
典型模式
- State
- Menmento
State狀態模式
動機
- 在軟件構建過程中,某些對象的狀態如果改變,其行為也會隨之而發生變化,比如文檔處于之都狀態,其支持的行為和讀寫狀態支持的行為就可能完全不同。
- 如何在運行時根據對象的狀態來透明地更改對象的行為?而不會為對象操作和狀態轉換之間引入緊耦合?
模式定義
允許一個對象在其內部狀態改變時改變它的行為。從而使對象看起來似乎修改了其行為。
結構
類圖
模式中的角色:
- 1 上下文環境(Context):它定義了客戶程序需要的接口并維護一個具體狀態角色的實例,將與狀態相關的操作委托給當前的Concrete State對象來處理。
- 2 抽象狀態(State):定義一個接口以封裝使用上下文環境的的一個特定狀態相關的行為。
- 3 具體狀態(Concrete State):實現抽象狀態定義的接口。
狀態模式的代碼演示
import sun.security.krb5.internal.NetClient;
public abstract class NetworkState{
public NetworkState next;//指針,指向下一狀態
public abstract void Operation1();
public abstract void Operation2();
public abstract void Operation3();
/ /抽象出三個方法
}
public class OpenState extends NetworkState{
@Override
public void Operation1(){
//**********
next = new CloseState();
}
@Override
public void Operation2(){
//..........
next = new ConnectState();
}
@Override
public void Operation3(){
//$$$$$$$$$$
next = new OpenState();
}
}
public class CloseState extends NetworkState{
@Override
public void Operation1(){
//**********
next = new ConnectState();
}
@Override
public void Operation2(){
//..........
next = new OpenState();
}
@Override
public void Operation3(){
//$$$$$$$$$$
next = new CloseState();
}
}
public class ConnectState extends NetworkState{ }
public class WaitingState extends NetworkState{ }
//...
class NetworkProcessor{
NetworkState state;
public NetworkProcessor(NetworkState state){
this.state = state;
}
public void Operation1(){
//...
state.Operation1();
state = state.next;
//...
}
public void Operation2(){
//...
state.Operation2();
state = state.next;
//...
}
public void Operation3(){
//...
state.Operation3();
state = state.next;
//...
}
}
模式總結
優點
- 狀態模式將與特定狀態相關的行為局部化,并且將不同狀態的行為分割開來。
- 所有狀態相關的代碼都存在于某個ConcereteState中,所以通過定義新的子類很容易地增加新的狀態和轉換。
- 狀態模式通過把各種狀態轉移邏輯分不到State的子類之間,來減少相互間的依賴。
缺點
- 導致較多的ConcreteState子類