設計模式之狀態模式

2021-10-03 15:28:15 字數 3015 閱讀 2151

設計模式是經驗總結,是學習軟體設計的有效方法,因此,了解和理解現有的設計模式,是提高軟體設計的有效途徑之一,這裡將介紹相關的設計模式,並通過示例了理解其用法。

狀態模式允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。

狀態模式屬於行為型模式。

意圖:允許物件在內部狀態發生改變時改變它的行為,物件看起來好像修改了它的類。

主要解決:物件的行為依賴於它的狀態(屬性),並且可以根據它的狀態改變而改變它的相關行為。

何時使用:**中包含大量與物件狀態有關的條件語句。

如何解決:將各種具體的狀態類抽象出來。

關鍵**:通常命令模式的介面中只有乙個方法。而狀態模式的介面中有乙個或者多個方法。而且,狀態模式的實現類的方法,一般返回值,或者是改變例項變數的值。也就是說,狀態模式一般和物件的狀態有關。實現類的方法有不同的功能,覆蓋介面中的方法。狀態模式和命令模式一樣,也可以用於消除 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的乙個特...