狀態模式: 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。
狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷簡單化。
public
abstract
class state
public
class context
public state state
set}
public
void
request()
}public
class concretestatea:state
}public
class concretestateb : state
}在main方法中的呼叫:
context c = new context(new concretestatea());
c.request();
c.request();
c.request();
c.request();
console.readline();
狀態模式的好處是將與特定狀態相關的行為區域性化,並且將不同狀態的行為分割開來
這樣做是將特定的狀態相關額行為放入乙個物件中,由於所有與狀態相關的**都存在於某個concretestate中,所以通過定義新的子類可以很容易的增加新的狀態和轉換
狀態模式可以消除龐大的條件分支語句,狀態模式通過把各種狀態轉移邏輯分布到state的子類之間,來減少相互間的依賴
好了,接下來就是實戰了:
題: 公司員工一天的上班狀態。 上午12點之前屬於早上,這個時候工作很精神。 之後12-13點的時候是中午,一般都是吃吃飯,午休一下 。 13-18點的時候則是下午工作狀態,如果18點完成工作了,則下班。 如果沒完成則加班。加班到20點還沒完成,那就下班走人吧。
請用物件導向的思想解題。
這是乙個很經典的狀態模式的題。
首先寫乙個工作狀態的抽象類和呼叫該抽象類的具體工作類:
public
abstract
class workstate
public
class work
public
bool iscomplected
private workstate state;
public
work(workstate state)
public
void
setstate(workstate s)
public
void
docode()
}
在接下來寫各個子類 繼承工作狀態類:
//早上工作
public
class forenoonstate:workstate
點,上午工作中。", w.hour);
}else }}
//中午工作
public
class noonstate : workstate
點,中午工作中。", w.hour);
}else
}
}//下午工作
public
class afternoonstate : workstate
點,下午工作中。", w.hour);
}else
}
}//晚上
public
class eveningstate : workstate
else
點,晚上工作中。", w.hour);
}else}}
}//睡眠狀態
public
class sleepingstate : workstate
,不行了,腦子好痛,我要睡了",w.hour);}}
//下班休息狀態
public
class reststate : workstate
,下班回家,走人", w.hour);
}}
在main方法中呼叫:
static void main(string args)
如果把,w.iscompleted 變為false 則就是另一種狀態了。晚上該加班了。 設計模式之狀態模式
一 作用 允許乙個物件在其內部狀態改變時改變它的行為,物件看起來似乎修改了它的類。其別名為狀態物件 objects for states 狀態模式是一種物件行為型模式。二 例子 狀態抽象類 abstract class state 具體狀態類,每個狀態對應乙個類 class concretestat...
設計模式之 狀態模式
gof 設計模式 中給狀態模式下的定義為 允許乙個物件在其內部狀態改變時改變它 的行為。這個物件看起來似乎修改了它的類。看起來,狀態模式好像是神通廣大 居然能夠 修改自身的類 能夠讓程式根據不同的外部情況來做出不同的響應,最直接的方法就是在程式中將這些可能發生的外部情況全部考慮到,使用 if els...
設計模式之狀態模式
定義 允許乙個物件在其內部狀態變化時改變它的行為,物件看起來似乎修改了它所屬的類。類圖 說明 context表示環境類,它定義了客戶應用程式感興趣的介面,並維護乙個concretestate子類的例項,這個例項用於定義當前狀態 state表示抽象狀態類,它定義了乙個介面以封裝與context的乙個特...