設計模式是經驗總結,是學習軟體設計的有效方法,因此,了解和理解現有的設計模式,是提高軟體設計的有效途徑之一,這裡將介紹相關的設計模式,並通過示例了理解其用法。
狀態模式允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。
狀態模式屬於行為型模式。
意圖:允許物件在內部狀態發生改變時改變它的行為,物件看起來好像修改了它的類。
主要解決:物件的行為依賴於它的狀態(屬性),並且可以根據它的狀態改變而改變它的相關行為。
何時使用:**中包含大量與物件狀態有關的條件語句。
如何解決:將各種具體的狀態類抽象出來。
關鍵**:通常命令模式的介面中只有乙個方法。而狀態模式的介面中有乙個或者多個方法。而且,狀態模式的實現類的方法,一般返回值,或者是改變例項變數的值。也就是說,狀態模式一般和物件的狀態有關。實現類的方法有不同的功能,覆蓋介面中的方法。狀態模式和命令模式一樣,也可以用於消除 if…else 等條件選擇語句。
應用例項:1、打籃球的時候運動員可以有正常狀態、不正常狀態和超常狀態。 2、曾侯乙編鐘中,「鍾是抽象介面」,「鐘a」等是具體狀態,「曾侯乙編鐘」是具體環境(context)。
優點:1、封裝了轉換規則。 2、列舉可能的狀態,在列舉狀態之前需要確定狀態種類。 3、將所有與某個狀態有關的行為放到乙個類中,並且可以方便地增加新的狀態,只需要改變物件狀態即可改變物件的行為。 4、允許狀態轉換邏輯與狀態物件合成一體,而不是某乙個巨大的條件語句塊。 5、可以讓多個環境物件共享乙個狀態物件,從而減少系統中物件的個數。
缺點:1、狀態模式的使用必然會增加系統類和物件的個數。 2、狀態模式的結構與實現都較為複雜,如果使用不當將導致程式結構和**的混亂。 3、狀態模式對"開閉原則"的支援並不太好,對於可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的源**,否則無法切換到新增狀態,而且修改某個狀態類的行為也需修改對應類的源**。
使用場景:1、行為隨狀態改變而改變的場景。 2、條件、分支語句的代替者。
注意事項:在行為受狀態約束的時候使用狀態模式,而且狀態不超過 5 個。
這裡以報警系統為例來說明狀態模式。如果報警裝置處於正常工作狀態並發現有人,就會發出警報聲;如果處於非工作狀態(正常工作時間),就不應該發出警報聲。狀態圖如下所示:
這裡有兩個狀態,兩個狀態可以互相切換,乙個狀態下識別有人將發出警報聲,乙個狀態下什麼都不做。系統初始狀態為非工作狀態。
下面就來看看其狀態介面,**如下:
package cn.lut.curiezhang.designpattern.state;
//報警裝置狀態介面
public
inte***ce
ialarmdevicestatus
有了介面,來實現報警裝置處於工作狀態,識別有人將發出警報聲,**如下:
package cn.lut.curiezhang.designpattern.state;
public
class
alarmdeviceactivation
implements
ialarmdevicestatus
}
類似地,非工作狀態的**如下:
package cn.lut.curiezhang.designpattern.state;
public
class
alarmdeviceinactivation
implements
ialarmdevicestatus
}
有了狀態類,建立情境——報警系統來實現狀態的轉換,**如下:
package cn.lut.curiezhang.designpattern.state;
public
class
alarmsystem
public
void
activate()
public
void
inactivate()
public
void
detectedperson()
private
void
changestatus
(ialarmdevicestatus status)
}
現在就可以進行報警系統的測試了,**如下:
package cn.lut.curiezhang.designpattern.state;
/** * client
* */
public
class
client
}
**執行結果如下圖所示:
**實現就是這樣的,下面來看看上面設計模式的基本結構,通過類圖了解其基本構成,如下圖所示:
了解了其基本結構,就需要搞清楚這些類是怎麼樣來完成互動的,也就是這些物件之間是如何協作的?就通過順序圖來了解其工作過程,如下圖所示:
請注意其互動過程。
設計模式之狀態模式
一 作用 允許乙個物件在其內部狀態改變時改變它的行為,物件看起來似乎修改了它的類。其別名為狀態物件 objects for states 狀態模式是一種物件行為型模式。二 例子 狀態抽象類 abstract class state 具體狀態類,每個狀態對應乙個類 class concretestat...
設計模式之 狀態模式
gof 設計模式 中給狀態模式下的定義為 允許乙個物件在其內部狀態改變時改變它 的行為。這個物件看起來似乎修改了它的類。看起來,狀態模式好像是神通廣大 居然能夠 修改自身的類 能夠讓程式根據不同的外部情況來做出不同的響應,最直接的方法就是在程式中將這些可能發生的外部情況全部考慮到,使用 if els...
設計模式之狀態模式
定義 允許乙個物件在其內部狀態變化時改變它的行為,物件看起來似乎修改了它所屬的類。類圖 說明 context表示環境類,它定義了客戶應用程式感興趣的介面,並維護乙個concretestate子類的例項,這個例項用於定義當前狀態 state表示抽象狀態類,它定義了乙個介面以封裝與context的乙個特...