狀態模式主要解決當控制乙個物件狀態的轉換的條件表達過於複雜的情況,使得狀態的轉換不依賴於整體的操作。本文將通過乙個具體的例子說明狀態模式的應用。假設下面乙個場景:
乙個新任務提交後,先是收集資料,資料收集完成後等等分配一台機器,分配到機器後就可以將此任務部署至此機器後就可以通知相關模組開始工作。
先對此場景做分析如下:
任務的狀態可以分為:new, waiting, ready, running分別對應新任務提交,等待分配機器,準備部署,和部署完成於上面的步驟一一對應。
定義乙個任務類:
/*abstract*/ class task : igatherdata, iallotmachine, ideploytestmanchine, inotifyuser // 這裡是分別為以上四個步驟定義的介面
set}
// 任務的狀態
private taskstate _taskstate;
public taskstate taskstate
set}
public task()
// 可以指定乙個任務的當前狀態
public updatetask(taskstate tasktask)
/// 改變乙個任務的狀態至當前任務的下乙個狀態
///
public void changestate()
/// 以下是實現介面中的方法
/// 合併資料
public virtual bool gatherdata()
/// 分配機器
/// 分配機器放在基類裡面做,因為這個動作對每個任務來說基本都是一樣的
public virtual bool allotmachine()
/// 部署至測試機
/// 部署至測試機放在基類裡面做,因為這個動作對每個任務來說基本都是一樣的
public virtual bool deploytestmanchine()
/// 通知相關人員
/// 通知相關人員放在基類裡面做,因為這個動作對每個任務來說基本都是一樣的
public virtual bool deploytestmanchine()
}到此我們的任務類已經定義完成,其中有乙個changestate的方法,此方法負責呼叫狀態類的改變狀態的方法。
接下面就寫status類:
先是定義乙個超類,此類只有乙個方法就是changestate, 此方法負責控制任務狀態的轉換。
abstract class taskstate
下面定義具體的狀態類:
// 新任務狀態
class newtaskstate: taskstate
else // 如果合併資料任務失敗,將任務打到已清除狀態
}
}public newtaskstate()
}// 等待任務狀態
class waitingtaskstate : taskstate
else
}
}public waitingtaskstate()
public waitingtaskstate(updatetask task)
// 準備任務狀態
class readytaskstate : taskstate
else
}
}public readytaskstate()
public readytaskstate(updatetask task)
}// 執行任務狀態
class runningstate : taskstate
public runningstate()
public runningstate(updatetask task)
}// 下來看客戶端呼叫
task task = new task ();
task.taskidindatatable = 1111; // 為此任務指定乙個id
下來就最重要的,做了這麼多事就是為了下面的呼叫:
task.changestate();
task.changestate();
task.changestate();
task.changestate();
這樣此任務就完成了,客戶端根本不用關心任務的狀態是怎麼轉換的,因為每乙個狀態的轉換都是由當前的狀態決定自己的下乙個狀態是什麼,即使要修改狀態的流程也只需要修改狀態類就可以,也不用關心具體的操作。這樣做很方便的將狀態轉換、任務的具體步驟、與客戶端的呼叫分開,之間不受影響。
也可以指定乙個任務的當前狀態,從此狀態開始,比如可以指定此任務從wating開始,此任務就會從waiting對應的allotmachine開始執行:
task task = new task (new waitingtaskstate);
到此狀態模式的應該已全部寫完。^_^
設計模式 狀態模式 C
狀態模式是產生乙個可以改變其類的物件,通過前端物件狀態的變化來使後端工作的不同物件履行其職責。通過改變乙個物件的狀態,使它的工作物件也發生變化。如果乙個物件在決定它要做什麼之前總是要對當前的 狀態做很多的判斷,那麼就可以考慮使用狀態模式。乙個壞的例子 worker.h include ifndef ...
設計模式 狀態模式(c )
狀態模式適用於 乙個物件有多種狀態,在不同狀態下執行同一操作的行為是不同的。例如,檔案在read only write only write and read 狀態下,執行讀 寫等操作時的行為是不同的。狀態模式基本思想 用動態繫結 執行時繫結,多型,用虛函式實現 代替if else或switch,以...
設計模式 狀態模式(C )
參考 設計模式讀書筆記 狀態模式 如下 filename state.h datetime 2016.09.19 author hjs e mail jingshuang hu 163.com blog ifndef state h define state h include context.h ...