標籤:java 設計模式 狀態模式 state
1979年在湖北出土的曾侯乙編鐘,每一隻鐘都能發出不同的音。
用物件導向的語言來講,編鐘有能夠動態變化的屬性,也就是它所能發出的聲音。編鐘的這種屬性叫做狀態,而編鐘被叫做有狀態的對象。編鐘所能發出的聲音是由敲擊的那一隻鐘決定,而鐘的數目個每一隻鐘的狀態是事先確定的。
很多情況下,一個對象的行為取決於一個或多個動態變化的屬性,這樣的屬性叫做狀態,這樣的對象叫做有狀態的對象。
狀態模式的類圖如下:
狀態模式設計的角色有:
抽象狀態角色(State):定義一個介面,用以封裝環境對象的一個特定的狀態所對應的行為
具體狀態角色(ConcreteState):每一個具體狀態類都實現了環境的一個狀態所對應的行為。
環境角色(Context):定義用戶端所感興趣的介面,並且保留一個具體狀態類的執行個體。
從可以看出,環境類Context是所考察的類,而他的行為sampleOperation()是委派給類型為State的一個對象的。由於State本身是一個抽象類別或介面,實際擔當此任務的是具體的狀態類,即:ConcreteState。只給出了一個具體的狀態類,而實際情況中會有很多具體狀態類。換言之,環境類Context的行為SampleOperation()是委派給某一個具體狀態類的。
通過使用多態性原則,可以動態改變環境類Context的屬性State的內容,使其從從指向一個具體狀態類變換到指向另一個具體的狀態類,從而使環境類的行為sampleOperation()由不同的具體狀態來執行。
環境角色的源碼:
public class Context { private State state; public void sampleOperation(){ state.sampleOperation(); } public void setState(State state){ this.state = state; }} 抽象狀態介面:public interface State { public void sampleOperation();}具體狀態類:public class ConcreteState implements State { public void sampleOperation() { // do something }}
什麼情況下使用狀態模式
1、一個對象的行為依賴於它所處的狀態,對象的行為必須隨著其狀態的改變而改變
2、對象在某一個方法裡依賴於一重或多重的條件轉移語句,其中有大量的代碼。狀態模式把條件轉移語句的每一個分支都封裝到一個單獨的類裡。使得這些條件轉移分支能夠以類的方式獨立存在和演化。維護這些獨立的類也就不再影響到系統的其他部分。
Java設計模式——狀態模式(State)