狀態模式(state),當乙個物件的內在狀態改變時,允許改變其行為,這個物件看起來好像改變了其類。狀態模式主要解決的是當控制乙個物件的狀態轉換條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。
狀態模式uml類圖:
分析:由上圖可知(1)state類,抽象狀態類,定義乙個介面以封裝與context的乙個特定狀態相關的行為;(2)concretestate類,具體狀態,每乙個子類實現乙個與context的乙個特定狀態相關的行為;(3)context類,維護乙個concretestate子類的例項,這個例項定義當前的狀態
狀態模式實現:
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace state
/** concretestate類,具體狀態,每乙個子類實現乙個與context的乙個特定狀態相關的行為。
*/class concretestatea : state
}class concretestateb : state}/*
* context類,維護乙個concretestate子類的例項,這個例項定義當前的狀態
*/class context
public state getstate()
public void setstate(state state)
public void request()}}
客戶端:
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace state}}
狀態模式總結:
(1)狀態模式的好處就是將於特定狀態相關的行為區域性化,並且將不同狀態的行為分割開來。意即,將特定的狀態相關的行為都放入乙個物件中,由於所有與狀態相關的**都存在於某個concretestate中,所以通過定義新的子類可以很容易地增加新的狀態和轉換。
(2)這樣做的目的是為了消除龐大的條件分支語句,大的分支判斷會使得它們難以修改和擴充套件,狀態模式通過把各種狀態轉移邏輯分布到state的子類之間,來減少相互間的依賴。
(3)當乙個物件的行為取決於它們的狀態,並且它必須在執行時刻根據狀態改變它的行為時,就可以考慮使用狀態模式。
狀態模式案例—工作狀態
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace stateexample
/** 具狀態類
*/class forenoonstate : state
,上午狀態,精神百倍!", work.gethour());
}else
//throw new notimplementedexception();}}
class noonstate : state
,午飯時間!", work.gethour());
}else
//throw new notimplementedexception();}}
class afternoonstate : state
,下午狀態,繼續工作!", work.gethour());
}else
//throw new notimplementedexception();}}
class eveningstate : state
else
,加班狀態,疲憊!", work.gethour());
}else
}//throw new notimplementedexception();}}
class reststate : state
,完成工作,下班回家!",work.gethour());
//throw new notimplementedexception();}}
class sleepstate : state
,睡覺狀態!", work.gethour());
//throw new notimplementedexception();}}
/** 工作類
*/class work
public state getstate()
public void setstate(state state)
public double gethour()
public void sethour(double hour)
public bool getisfinish()
public void setisfinish(bool b)
public void writeprogram()}}
客戶端:
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace stateexample}}
執行結果:
狀態 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 ...