狀態模式(State)

2021-10-02 08:14:31 字數 3174 閱讀 9847

允許乙個物件在其內部狀態改變時改變它的行為。

狀態模式的角色

環境角色(context):也稱上下文,定義客戶端所感興趣的介面,並且保留乙個具體狀態類的例項。這個具體狀態類的例項給出此環境物件的現有狀態。

抽象狀態角色(state):定義乙個介面,用以封裝環境物件的乙個特定的狀態所對應的行為。

具體狀態角色(concretestate):每乙個具體狀態類都實現了環境(context)的乙個狀態所對應的行為。

以酒店訂房為例,房間的狀態有:空閒、預訂、入住。那麼空閒房間的狀態可以轉變為:預訂、入住。已預訂狀態房間的狀態可以轉變為:入住、取消預訂。已入住房間的狀態可以轉變為:退房。

狀態介面state:

package com.wuychn.state;

public inte***ce state

房間類room(環境角色):

package com.wuychn.state;

public class room

public void bookroom()

public void unsubscriberoom()

public void checkinroom()

public void checkoutroom()

public string tostring()

public state getfreetimestate()

public void setfreetimestate(state freetimestate)

public state getcheckinstate()

public void setcheckinstate(state checkinstate)

public state getbookedstate()

public void setbookedstate(state bookedstate)

public state getstate()

public void setstate(state state)

}

房間狀態(具體狀態角色):

空閒狀態:

package com.wuychn.state;

public class freetimestate implements state

@override

public void bookroom()

@override

public void unsubscriberoom()

@override

public void checkinroom()

@override

public void checkoutroom()

}

入住狀態:

package com.wuychn.state;

public class checkinstate implements state

@override

public void bookroom()

@override

public void unsubscriberoom()

@override

public void checkinroom()

@override

public void checkoutroom()

}

預定狀態:

package com.wuychn.state;

public class bookedstate implements state

@override

public void bookroom()

@override

public void unsubscriberoom()

@override

public void checkinroom()

@override

public void checkoutroom()

}

測試**:

package com.wuychn.state;

public class test

rooms[0].bookroom();

rooms[0].checkinroom();

rooms[0].bookroom();

system.out.println(rooms[0]);

system.out.println("-------------");

rooms[1].checkinroom();

rooms[1].bookroom();

rooms[1].checkoutroom();

rooms[1].bookroom();

system.out.println(rooms[1]);

}}

輸出:

您已經預定成功了!

入住成功

該房間已經入住了

該房間的狀態是:com.wuychn.state.checkinstate

-------------

您已經入住了!

該房間已經入住了

退房成功

您已經預定成功了!

該房間的狀態是:com.wuychn.state.bookedstate

優點:

1、封裝了轉換規則。

2、列舉可能的狀態,在列舉狀態之前需要確定狀態種類。

3、將所有與某個狀態有關的行為放到乙個類中,並且可以方便地增加新的狀態,只需要改變物件狀態即可改變物件的行為。

4、允許狀態轉換邏輯與狀態物件合成一體,而不是某乙個巨大的條件語句塊。

缺點:1、狀態模式的使用必然會增加系統類的物件的個數。

2、狀態模式的結構與實現都較為複雜,如果使用不當講導致程式結構和**的混亂。

3、狀態模式對「開閉原則」的支援並不太好,對於可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的源**,否則無法切換到新增狀態;而且修改某個狀態類的行為也需修改對應類的源**。

1、物件的行為依賴於它的狀態(屬性)並且可以根據它的狀態而改變它的相關行為

2、**中包含大量與物件狀態相關的條件語句

原文:

狀態 State 模式

物件狀態影響物件行為 物件擁有不同的狀態,往往會行使不同的行為.1 動機 在軟體構建過程中,某些物件的狀態如果改變,其行為也會隨之而發生變化。比如文件處於唯讀狀態,其支援的行為和讀寫狀態支援的行為就可能完全不同。如何在執行時根據物件的狀態來透明地更改物件的行為?而不會為物件操作和狀態轉化之前引入緊耦...

狀態模式 State

個人理解 核心是context維護乙個當前狀態,並在invoke狀態方法時,將context維護的當前狀態更新至下一狀態 uml類圖 實現 using system namespace decoratormode public class agecontext public void printag...

state 狀態模式

include include using namespace std 1 將 state宣告為 context的友元類 friend class 其作用是讓 state模式訪問 context 的 protected介面 changesate 2 state 及其子類中的操作都將 context ...