主體思想:狀態決定行為。 應用環境:同一對象,在狀態轉換過程中,行為隨著狀態一直在改變。 e.g. 燈初始狀態是關閉的,按一下開啟,再按一下關閉(不要跟我說你家的水晶變色大燈)。在這一個過程中,觸發行為都是按一下開關,電燈會根據自身狀態的不同調用不同的行為去實現。如果我們不適用設計模式去實現著這段邏 ...
主體思想:狀態決定行為。
應用環境:同一對象,在狀態轉換過程中,行為隨著狀態一直在改變。
e.g. 燈初始狀態是關閉的,按一下開啟,再按一下關閉(不要跟我說你家的水晶變色大燈)。在這一個過程中,觸發行為都是按一下開關,電燈會根據自身狀態的不同調用不同的行為去實現。如果我們不適用設計模式去實現著這段邏輯,一般就是這兩種實現方法吧
1.
if(燈狀態==XXX) { .... } else { XXXXXXXX }
2.
switch(燈狀態) { case XX: Xxxxxx break; case vv: vvvvvvvv break; default: llllll }
目前就是燈打開,關閉兩個狀態,咱們當然可以用這種if ,switch的方式來做。 如果實體對象狀態很多的話,採用上面判斷的方式,一個類方法的代碼就老長老長了。ok ,那麼咱們採用狀態模式來看看,該如何實現。
1.分析需求,設計類
狀態模式,毫無疑問,咱們需要實體類(Light),狀態類(LightState)。由於狀態類,會有不同狀態,相同的按燈動作。因此我們這麼設計。
抽象狀態類:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel_01 8 { 9 abstract class LightState 10 { 11 public abstract void PushClick(Light light); 12 } 13 }
實體類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DesignModel_01 { class Light { private LightState state; public Light(LightState state) { this.State = state; } public LightState State { get { return state; } set { state = value; } } public void LightClick() { this.state.PushClick(this); } } }
好了,主要工作完成,下麵就是具體燈的那個狀態了。目前就兩種狀態,打開關閉。
LightOn :
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DesignModel_01 { class LightOn : LightState { public override void PushClick(Light light) { Console.WriteLine("燈正在關閉ing..."); light.State = new LightOff(); Console.WriteLine("燈已經關閉..."); } } }
LightOff :
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DesignModel_01 { class LightOff : LightState { public override void PushClick(Light light) { Console.WriteLine("燈正在打開ing..."); light.State = new LightOpen(); Console.WriteLine("燈已經打開..."); } } }
測試man:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DesignModel_01 { class Program { static void Main(string[] args) { Light l = new Light(new LightOpen()); for (int i = 0; i < 10; i++) { l.LightClick(); } Console.ReadLine(); } } }
好吧,打臉了。。。。代碼似乎比if,switch 判斷還多。所以應對不同的業務場景,我們還是要理智的採用不同的方案。
優點
a 狀態模式將與特定狀態相關的行為局部化,並且將不同狀態的行為分割開來。
b 所有狀態相關的代碼都存在於某個ConcereteState中,所以通過定義新的子類很容易地增加新的狀態和轉換。
c 狀態模式通過把各種狀態轉移邏輯分不到State的子類之間,來減少相互間的依賴。
缺點
a 導致較多的ConcreteState子類
適用場景
a 當一個對象的行為取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行為時,就可以考慮使用狀態模式來。
b 一個操作中含有龐大的分支結構,並且這些分支決定於對象的狀態。
內容參考:
http://www.cnblogs.com/god_bless_you/archive/2010/06/06/1752517.html