定義:當-個物件內在狀態改變時允許其改變行為,這個物件看起來像改變了其類。)
型別:行為型模式
類圖:
狀態模式結構:
state:抽象狀態角色,介面或抽象類,負責物件狀態定義,並且封裝環境角色以實現狀態切換。
concretestate:具體狀態角色,每乙個具體狀態必須完成兩個職責:本狀態的行為管理以及趨向狀態處理,通俗地說,就是本狀態下要做的事情,以及本狀態如何過渡到其他狀態。
context:環境角色,定義客戶端需要的介面,並且負責具體狀態的切換。
通用**實現:
例項:push顯示紅->黃->綠,pull顯示綠->黃->紅
public inte***ce state
public class context
public void setstate(final state state)
public void push()
public void pull()
}
//red
public class concretestatea implements state
@override
public void handlepull(final context context)
@override
public string getcolor()
}
//yellow
public class concretestateb implements state
@override
public void handlepull(final context context)
@override
public string getcolor()
}
//green
public class concretestatec implements state
@override
public void handlepull(final context context)
@override
public string getcolor()
}
執行結果
push:
redyellowgreen
pull:
greenyellowred
狀態模式的優點:
l 結構清晰:避免了過多的switch... case或者if... else語句的使用,避免了程式的複雜性,提高系統的可維
l 護性.
l 遵循設計原則:很好地體現了開閉原則和單一職責原則,每個狀態都是乙個子類,你要增加狀態就要增加
l 子類,你要修改狀態,你只修改乙個子類就可以了.
l 封裝性非常好:這也是狀態模式的基本要求,狀態變換放置到類的內部來實現,外部的呼叫不用知道類內部如何實現狀態和行為的變換。
狀態模式的缺點:
l 只有乙個缺點,子類會太多,也就是類膨脹。如果乙個事物有很多個狀態,如果完全使用狀態模式就會有太多的子類,不好管理,需要開發者在專案衡量。
狀態模式的適用場景:
l行為隨狀態改變而改變的場景:這也是狀態模式的根本出發點,例如許可權設計,人員的狀態不同即使執行相同的行為結果也會不同,在這種情況下需要考慮使用狀態模式。
l條件、分支判斷語句的替代者:在程式中大量使用swith語句或者if判斷語句會導致程式結構不清晰,邏輯揭亂,使用狀態模式可以很好地避免這一問題,它通過擴充套件子類實現了條件的判斷處理。
注意事項:
l 狀態模式適用於當某個物件在它的狀態發生改變時,它的行為也隨著發生比較大的變化,也就是說在行為受狀態約束的情況下可以使用狀態模式,而且使用時物件的狀態最好不要超過5個。
20 狀態模式
場景 酒店系統中,房間的狀態變化 核心 用於解決系統中複雜物件的狀態轉換以及不同狀態下行為的封裝問題 結構 context環境類 環境類中維護乙個state物件,他是定義了當前的狀態 state抽象狀態類 concretestate具體狀態類 每乙個類封裝了乙個狀態對應的行為 開發中的場景 銀行系統...
20 狀態模式
介面或抽象類,負責物件狀態定義,並且封裝環境角色以實現狀態切換。每乙個具體狀態必須完成兩個職責 本狀態的行為管理以及趨向狀態處理,通俗地說,就是本狀態下要做的事情,以及本狀態如何過渡到其他狀態。定義客戶端需要的介面,並且負責具體狀態的切換。抽象環境角色 public abstract class s...
20 狀態模式
1 狀態模式 state pattern 它主要用來解決物件在多種狀態轉換時,需要對外輸出不同的行為的問題。狀態和行為是一一對應的,狀態之間可以相互轉換 2 當乙個物件的內在狀態改變時,允許改變其行為,這個物件看起來像是改變了其類 1 context 類為環境角色,用於維護state例項,這個例項定...