有人說“人的起點起初都是一樣的,在后來的加加減減中,慢慢出現了差距……”人生是什么?人生如你腳下的路,如但丁在《神曲》里的一句話“在人生旅程的中途……”不論曾經做對了什么,做錯了什么,用一顆心、一生情去堅定走你沒走完的路。人生是什么?是一幅優美的畫卷,是一段離奇的愛情故事,還是一曲悠悠的傷感樂曲……我無法形容人生是什么,為什么會有各式各樣的人生經歷,有人哭有人笑,有人淡然,有人超然,細看人間故事,品酸甜苦辣。
每個人的人生猶如一個個小小的圓圈,隨著時間的推移,這個圓慢慢的慢慢的長大,圓里面是一個過程,紛繁復雜著那一段一段的經歷。從童年開始,一直到老年落幕,我們都一直在人生的舞臺上盡情演繹自己的故事。今天我們的設計模式就從人生開始說起,人生有著五個明確的階段,從童年,少年,青年,中年,一直到老年落幕,也可以這么說,人的一生分為五個狀態,宛如我們設計模式中的狀態模式,首先我們來看一下狀態模式的結構圖:
? ? ? ?
以我們的人生為例,看看狀態模式是如何活躍著我們人生的舞臺:
首先抽象狀態類-----抽象類 LifeState
? ? ? ??
~~~
????//定義一個抽象的LifeState類????
????public?abstract?class?LifeState????
????{??
????????public?abstract?void?ChangeLife(Life?l);??
????}??
~~~
具體的人生階段
~~~
????//童年階段-ChildhoodState????
????class?ChildhoodState:?LifeState??
????{????
????????public?override?void?ChangeLife(Life?l)???
????????{????
????????????Console.WriteLine("童年是一片無邊無際的藍天,包納了無限的景象!");????
????????????l.State=?new?JuvenileState();????
????????}????
????}????
????//少年階段-JuvenileState???
????class?JuvenileState?:LifeState?????
????{????
????????public?override?void?ChangeLife(Life?l)????
????????{????
????????????Console?.WriteLine("少年要用笑臉去追尋夢想,面對夢想,迎接夢想!");??
????????????l.State=?new?YouthState();??
????????}????
????}????
????//青年階段-?YouthState???
????class?YouthState?:LifeState???????
????{????
????????public?override?void?ChangeLife(Life?l)????
????????{????
????????????Console.WriteLine("美麗的豆蔻年華,從青澀走向成熟!");????
????????????l.State?=?new?MidlifeState?();????
????????}????
????}????
????//中年階段-MidlifeState????
????class?MidlifeState?:LifeState?????
????{????
????????public?override?void??ChangeLife(Life?l)????
????????{????
????????????Console.WriteLine("中年的你,是否實現自己的愿望,滿意的工作,幸福的家庭!");??
????????????l.State=?new?ElderyState();????
????????}????
????}????
??
????//老年階段-ElderyState??
????class?ElderyState:LifeState???
????{??
????????public?override?void?ChangeLife(Life?l)??
????????{??
????????????Console?.WriteLine?("最美不過夕陽紅!");??
????????}??
????}??
~~~
人生類-----Life
~~~
????//定義一個人生類-Life????
????public?class?Life??????
????{????
????????//初始化當前人生????
????????private?LifeState?state;????
????????public?Life(LifeState?state)????
????????{????
????????????this.state?=?state;????
????????}????
????
????????public?LifeState?State????
????????{????
????????????get?{?return?state;?}????
????????????set?{?state?=?value;?}????
????????}????
????
????????public?void??ChangeLife()?//方法名可以改變????
????????{????
????????????state.ChangeLife(this);????
????????}????
????}????
~~~
客戶端代碼:
~~~
static?void?Main(string[]?args)??
????????{??
????????????Life?life?=?new?Life(?new?ChildhoodState());????
????????????life.ChangeLife();????
????????????life.ChangeLife();????
????????????life.ChangeLife();????
????????????life.ChangeLife();???
????????????life.ChangeLife();???
??
????????????Console.Read();??
????????}??
~~~
運行結果如下:
? ? ? ? ? ? ?
狀態模式主要解決的是當控制一個對象狀態轉化的條件表達式過于復雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把復雜的判斷邏輯簡化,總的來說就是當一個對象的內在狀態改變時允許改變其行為,這個對象看起來是改變了其類。
在面向對象軟件設計時,常常碰到某一個對象由于狀態的不同而有不同的行為。如果用if else或是switch case等方法處理,對象操作及對象的狀態就耦合在一起,碰到復雜的情況就會造成代碼結構的混亂。在這種情況下,就可以使用狀態模式來解決問題。