在狀態模式(state pattern)中,類的行為是基於它的狀態改變的。這種型別的設計模式屬於行為型模式。
在狀態模式中,我們建立表示各種狀態的物件和乙個行為隨著狀態物件改變而改變的 context 物件。
意圖:允許物件在內部狀態發生改變時改變它的行為,物件看起來好像修改了它的類。
何時使用:**中包含大量與物件狀態有關的條件語句。
如何解決:將各種具體的狀態類抽象出來。
關鍵**:通常命令模式的介面中只有乙個方法。而狀態模式的介面中有乙個或者多個方法。而且,狀態模式的實現類的方法,一般返回值,或者是改變例項變數的值。也就是說,狀態模式一般和物件的狀態有關。實現類的方法有不同的功能,覆蓋介面中的方法。狀態模式和命令模式一樣,也可以用於消除 if…else 等條件選擇語句。
應用例項: 1、打籃球的時候運動員可以有正常狀態、不正常狀態和超常狀態。 2、曾侯乙編鐘中,『鍾是抽象介面』,'鐘a』等是具體狀態,'曾侯乙編鐘』是具體環境(context)。
優點: 1、封裝了轉換規則。 2、列舉可能的狀態,在列舉狀態之前需要確定狀態種類。 3、將所有與某個狀態有關的行為放到乙個類中,並且可以方便地增加新的狀態,只需要改變物件狀態即可改變物件的行為。 4、允許狀態轉換邏輯與狀態物件合成一體,而不是某乙個巨大的條件語句塊。 5、可以讓多個環境物件共享乙個狀態物件,從而減少系統中物件的個數。
缺點: 1、狀態模式的使用必然會增加系統類和物件的個數。 2、狀態模式的結構與實現都較為複雜,如果使用不當將導致程式結構和**的混亂。 3、狀態模式對"開閉原則"的支援並不太好,對於可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的源**,否則無法切換到新增狀態,而且修改某個狀態類的行為也需修改對應類的源**。
使用場景: 1、行為隨狀態改變而改變的場景。 2、條件、分支語句的代替者。
注意事項:在行為受狀態約束的時候使用狀態模式,而且狀態不超過 5 個。
我們將建立乙個 state 介面和實現了 state 介面的實體狀態類。context 是乙個帶有某個狀態的類。
statepatterndemo,我們的演示類使用 context 和狀態物件來演示 context 在狀態改變時的行為變化。
建立乙個介面。
package demo01.state;
import demo01.context.context;
/** * @description:
* @author: lay
* @date: created in 17:01 2018/12/12
* @modified by:intellij idea
*/public
inte***ce
state
建立實現介面的實體類。
package demo01.state.impl;
import demo01.context.context;
import demo01.state.state;
/** * @description:
* @author: lay
* @date: created in 17:02 2018/12/12
* @modified by:intellij idea
*/public
class
startstate
implements
state
public string tostring()
}
package demo01.state.impl;
import demo01.context.context;
import demo01.state.state;
/** * @description:
* @author: lay
* @date: created in 17:03 2018/12/12
* @modified by:intellij idea
*/public
class
stopstate
implements
state
public string tostring()
}
建立 context 類。
package demo01.context;
import demo01.state.state;
/** * @description:
* @author: lay
* @date: created in 17:02 2018/12/12
* @modified by:intellij idea
*/public
class
context
public
void
setstate
(state state)
public state getstate()
}
使用 context 來檢視當狀態 state 改變時的行為變化。
package demo01;
import demo01.context.context;
import demo01.state.impl.startstate;
import demo01.state.impl.stopstate;
/** * @description:
* @author: lay
* @date: created in 17:03 2018/12/12
* @modified by:intellij idea
*/public
class
statepatterndemo
}
執行程式,輸出結果:
player is in start state
start state
player is in stop state
stop state
設計模式(二十) 狀態模式
一 例 工作狀態 class work public void sethour int hour public boolean isworkfinished public void setworkfinished boolean workfinished public void writeprogr...
設計模式(二十一) 狀態模式
狀態模式也是一種行為型模式,當我們的程式中需要一些狀態轉換,對於不同的狀態需要不同的行為時,我們就可以考慮使用狀態模式。下面用交通燈來當例子。我們需要紅黃綠三種顏色的狀態。inte ce state class redstate implements state class yellowstate ...
狀態模式 java設計模式(二十二)
共享狀態 優缺點和適用範圍 jdk中的應用 狀態模式 state pattern 允許乙個物件在內部狀態改變時改變行為,看起來似乎修改了類。狀態模式結構。狀態轉換可以由環境類統一負責。新增具體狀態需要修改環境類。public void changestate else if value 1 publ...