如果我們在編寫**的時候,遇到大量的條件判斷的時候,可能會採用策略模式來優化結構,因為這時涉及到策略的選擇,但有時候仔細檢視下,就會發現,這些所謂的策略其實是物件的不同狀態,更加明顯的是,物件的某種狀態也成為判斷的條件
乙個類對外提供了多個行為,同時該類物件有多種狀態,不同狀態下對外的行為的表現不同,比如無人自動咖啡售賣機開發乙個控制程式。
使用者可以再咖啡機上進行支付、退款、購買、取咖啡操作
不同狀態下,這四種操作將有不同的表現。比如在沒有支付的狀態下,使用者在咖啡機上點退款、購買、取咖啡,和在已支付的狀態下做著三個操作時不一樣的。
面對這樣的需求,你可能會寫出這樣的**:
public
class
coffeemachine
}public
void
pay()}
public
void
refund()
}// 購買
public
void
buy()}
// 取coffee
public
void
getcoffee()
else
break
;case sold_out:
system.out.
println
("咖啡已售罄,不可購買!");}}}
這種寫法,如果新增一種狀態或者改變狀態的行為,那麼改動特別大,極其難以維護,因此我們接下來使用狀態模式來解決這個問題
改進上面的例子,使用狀態模式
咖啡機**:
public
class
newcoffeemachine
}public
void
pay(
)public
void
refund()
public
void
buy(
)public
void
getcoffee()
}
狀態介面類:
public
inte***ce
state
未支付狀態實現類:
public
class
nopaystate
implements
state
@override
public
void
pay(
)@override
public
void
refund()
@override
public
void
buy(
)@override
public
void
getcoffee()
}
支付狀態實現類:
public
class
paystate
implements
state
@override
public
void
pay(
)@override
public
void
refund()
@override
public
void
buy(
)@override
public
void
getcoffee()
}
售出狀態實現類:
public
class
soldstate
implements
state
@override
public
void
pay(
)@override
public
void
refund()
@override
public
void
buy(
)@override
public
void
getcoffee()
}
售罄狀態實現類:
public
class
soldoutstate
implements
state
@override
public
void
pay(
)@override
public
void
refund()
@override
public
void
buy(
)@override
public
void
getcoffee()
}
設計模式 狀態模式
狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一些列類當中,可以把複雜的判斷邏輯簡化。當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行...
設計模式 狀態模式
1.概述 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。2.解決的問題 主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。3.模式中的角色 3.1 上下文環境 context 它定義了客...
設計模式 狀態模式
描述 允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。通常應用在有好多狀態的流程中。類圖 以下程式模擬糖果機器投幣取糖果的狀態流程。1.定義狀態...