狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的邏輯簡單化。當然,如果這個狀態判斷很簡單,那就沒有必要使用「狀態模式」了。
當乙個物件的內部狀態改變時允許改變其行為,這個物件看起來像是改變了其類
其中,state:抽象狀態類,定義乙個介面以封裝與context的乙個特定狀態相關的行為。
context:維護乙個concretestate子類的例項,這個例項定義當前的狀態
1.乙個物件的行為取決於它的狀態,並且它必須在執行時根據狀態改變它的行為
2.乙個操作中含有龐大的多分支結構,並且這些分支取決於物件的狀態
例項背景:不同的工作時間,有不同的工作狀態,隨之也就有不同的行為
12點以前:上午工作,精神百倍
12點-13點:餓了,午飯;犯睏,午休
13點-17點:下午狀態還不錯,繼續努力
抽象狀態類,定義乙個抽象方法「寫程式」,這個方法被下面的具體狀態類所重寫
public abstract class state
上午、中午、下午等等工作狀態類,對應於結構圖中的concretestate,重寫抽象狀態類的」寫程式「的方法。每個具體工作狀態類都要進行判斷,在特定的時間內有特定的狀態。(以上午工作狀態類為例,其餘類**類似)
//上午工作狀態類
public class forenoonstate : state
else}}
工作類,對應於結構圖中的context
public class work
private double hour;
//「鐘點」屬性,狀態轉換的依據
public double hour
set
}private bool finish = false;
//「任務完成」屬性,是否能下班的資料
public bool taskfinished
set
}public void setstate(state s)
public void writeprogram()
}
客戶端**
//緊急專案
1.將與特定狀態相關的行為區域性化,並且將不同狀態的行為分割開來
2.將特定的狀態相關的行為都放在乙個物件中,由於所有與狀態相關的**都存在於某個concretestate當中,所以通過定義新的子類可以很容易的增加新的狀態和轉換
3.消除了龐大的分支判斷語句,通過把各種狀態轉移邏輯分布到state子類之間,來減少相互間的依賴。
狀態 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 ...