允許乙個物件在其內部狀態改變時改變它的行為。物件看起來似乎修改了它的類。它有兩種使用情況:(1)乙個物件的行為取決於它的狀態, 並且它必須在執行時刻根據狀態改變它的行為。(2)乙個操作中含有龐大的多分支的條件語句,且這些分支依賴於該物件的狀態。比如乙個你和心愛的那個
在軟體構建過程中,某些物件的狀態如果改變,其行為也隨之而發生變化,比如文件處於唯讀狀態,其支援的行為和讀寫狀態支援的行為就可能完全不同;如何在執行時候根據物件的 狀態來透明的更改物件的行為,而不會為物件操作和狀態轉化之間引入緊耦合
抽象狀態(state)
定義乙個介面以封裝與context的乙個特定狀態相關的行為。
具體狀態(xxstate)
每乙個子類實現乙個
環境(context)
表示各種狀態的物件和乙個行為隨著狀態物件改變而改變的物件
比如qq會員,各種會員型別,黃磚、黑磚、綠磚、紅磚、紫磚、粉磚,不同會員標識,可享受不同的待遇和福利,可以擁有不同的權利,幹不同的事。
#ifndef state_h
#define state_h
#include using namespace std;
class state;
class context
virtual ~context(){}
void request();
void setstate(state* state)
protected:
private:
state * m_state;
};class state
virtual ~state(){}
virtual void handle(context*) = 0;
protected:
private:
};class realstate1 : public state
virtual ~realstate1(){}
void handle(context* pcontext)
結果:
在物件的行動取決於本身的狀態時,可以適用於狀態模式,免去了過多的if–else判斷,這對於一些複雜的和繁瑣的判斷邏輯有很好的幫助
但是使用狀態模式,勢必會造成更多的介面和類,對於非常簡單的狀態判斷,可以不使用。
(1)物件的行為依賴於它的狀態,並且可以在執行時根據狀態改變行為。
(2)**中包含大量與物件狀態有關的if/else語句,這些條件對應於物件的各種狀態,這些冗餘條件語句的出現導致**的可維護性和靈活性變差,這種情況適合使用狀態模式進行優化。
設計模式C 實現(5) 狀態模式
軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...
設計模式 行為型設計模式 5 狀態模式(php)
行為型設計模式 狀態模式 狀態模式 state pattern 屬於行為型模式之一,它允許乙個物件在其內部狀態發生改變時而改變它的行為,看起來像修改了它的類。1 context環境類角色 定義了客戶感興趣的訪問介面 維護concretestate子類的例項 並且定義當前相關的狀態 2 抽象狀態類角色...
設計模式 狀態模式
狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一些列類當中,可以把複雜的判斷邏輯簡化。當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行...