狀態者模式(StatePattern)

2021-08-21 04:46:01 字數 3234 閱讀 4190

狀態者模式:

當乙個類中有多個狀態時,每個狀態對應著不同的行為。那麼對這些狀態的判斷和根據狀態完成的行為,就會導致多重條件語句,並且如果新增一種新的狀態時,需要更改之前現有的**。這樣的設計顯然違背了開閉原則。狀態模式正是用來解決這樣的問題的。

狀態者模式是對物件狀態的抽象,從而把物件中對狀態複雜的判斷邏輯已到各個狀態類裡面,從而簡化邏輯判斷。

狀態者模式的組成:1.抽象的狀態類 2.狀態類的具體實現 3.使用狀態的物件

例子

打籃球的時候運動員可以有正常狀態、不正常狀態和超常狀態。

曾侯乙編鐘中,』鍾是抽象介面』,』鐘a』等是具體狀態,』曾侯乙編鐘』是具體環境(context)。

銀行賬戶根據餘額可分為redstate、silverstate和goldstate。這些狀態分別代表透支賬號,新開賬戶和標準賬戶。賬號餘額在【-100.0,0.0】範圍表示處於redstate狀態,賬號餘額在【0.0 , 1000.0】範圍表示處於silverstate,賬號在【1000.0, 100000.0】範圍表示處於goldstate狀態。下面以這樣的乙個場景實現下狀態者模式,具體實現**如下所示:

下面,就以銀行賬戶的狀態來實現下狀態者模式。

account(賬戶類,包含賬戶狀態和賬戶的使用者名稱):

using system;

namespace cchoop.statepattern

public

string owner

public

account(string owner)

//存錢

public

void

deposit(float amount)

//取錢

public

void

withdraw(float amount)

//獲取利息

public

void

payinterest()}}

state(賬戶的狀態抽象類,所有具體的狀態類必須繼承自該類):

using system;

namespace cchoop.statepattern

public

float balance //餘額

public

float interest //利率

public

float lowerlimit //下限

public

float upperlimit //上限

public

abstract

void

deposit(float amount); //存款

public

abstract

void

withdraw(float amount); //取錢

public

abstract

void

payinterest(); //獲得的利息

public

abstract

void

checkstate(); //檢查狀態,進行狀態的切換}}

redstate(透支狀態):

using system;

namespace cchoop.statepattern

public

override

void

deposit(float amount)

public

override

void

withdraw(float amount)

public

override

void

payinterest()

public

override

void

checkstate()}}

}

silverstate(新開戶狀態):

using system;

namespace cchoop.statepattern

public

silverstate(float balance, account account)

public

override

void

deposit(float amount)

public

override

void

withdraw(float amount)

public

override

void

payinterest()

public

override

void

checkstate()

else

if (this.balance < this.lowerlimit)}}

}

goldstate(標準狀態):

using system;

namespace cchoop.statepattern

public

override

void

deposit(float amount)

public

override

void

withdraw(float amount)

public

override

void

payinterest()

public

override

void

checkstate()

else

if (this.balance < this.lowerlimit)}}

}

customer(測試):

中介者模式(調停者模式)

中介者模式 調停者模式 abstract class abstractcolleague public function setnumber number,abstractmediator am null class colleaguea extends abstractcolleague this...

設計模式 狀態模式

狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一些列類當中,可以把複雜的判斷邏輯簡化。當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行...

設計模式 狀態模式

1.概述 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。2.解決的問題 主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。3.模式中的角色 3.1 上下文環境 context 它定義了客...