介面或抽象類,負責物件狀態定義,並且封裝環境角色以實現狀態切換。
每乙個具體狀態必須完成兩個職責:本狀態的行為管理以及趨向狀態處理,通俗地說,就是本狀態下要做的事情,以及本狀態如何過渡到其他狀態。
定義客戶端需要的介面,並且負責具體狀態的切換。
/**
* 抽象環境角色
*/public
abstract
class
state
//行為1
public
abstract
void
handle1();
//行為2
public
abstract
void
handle2();
}
/**
* 環境角色
*/public
class
concretestate1
extends
state
@override
public
void
handle2()
}public
class
concretestate2
extends
state
@override
public
void
handle2()
}
/**
* 具體環境角色
*/public
class
context
//設定當前狀態
public
void
setcurrentstate(state currentstate)
//行為委託
public
void
handle1()
public
void
handle2()
}
環境角色有兩個不成文的約束:
/**
* 具體環境角色
*/public
class
client
}
避免了過多的switch…case或者if…else語句的使用,避免了程式的複雜性,提高系統的可維護性。
很好地體現了開閉原則和單一職責原則,每個狀態都是乙個子類,你要增加狀態就要增加子類,你要修改狀態,你只修改乙個子類就可以了。
這也是狀態模式的基本要求,狀態變換放置到類的內部來實現,外部的呼叫不用知道類內部如何實現狀態和行為的變換。
狀態模式既然有優點,那當然有缺點了。但只有乙個缺點,子類會太多,也就是類膨脹。如果乙個事物有很多個狀態也不稀奇,如果完全使用狀態模式就會有太多的子類,不好管理,這個需要大家在專案中自己衡量。其實有很多方式可以解決這個狀態問題,如在資料庫中建立乙個狀態表,然後根據狀態執行相應的操作,這個也不複雜,看大家的習慣和嗜好了。
這也是狀態模式的根本出發點,例如許可權設計,人員的狀態不同即使執行相同的行為結果也會不同,在這種情況下需要考慮使用狀態模式。
在程式中大量使用switch語句或者if判斷語句會導致程式結構不清晰,邏輯混亂,使用狀態模式可以很好地避免這一問題,它通過擴充套件子類實現了條件的判斷處理。
(20)狀態模式
定義 當 個物件內在狀態改變時允許其改變行為,這個物件看起來像改變了其類。型別 行為型模式 類圖 狀態模式結構 state 抽象狀態角色,介面或抽象類,負責物件狀態定義,並且封裝環境角色以實現狀態切換。concretestate 具體狀態角色,每乙個具體狀態必須完成兩個職責 本狀態的行為管理以及趨向...
20 狀態模式
場景 酒店系統中,房間的狀態變化 核心 用於解決系統中複雜物件的狀態轉換以及不同狀態下行為的封裝問題 結構 context環境類 環境類中維護乙個state物件,他是定義了當前的狀態 state抽象狀態類 concretestate具體狀態類 每乙個類封裝了乙個狀態對應的行為 開發中的場景 銀行系統...
20 狀態模式
1 狀態模式 state pattern 它主要用來解決物件在多種狀態轉換時,需要對外輸出不同的行為的問題。狀態和行為是一一對應的,狀態之間可以相互轉換 2 當乙個物件的內在狀態改變時,允許改變其行為,這個物件看起來像是改變了其類 1 context 類為環境角色,用於維護state例項,這個例項定...