備忘錄(Memento)
概念
備忘錄模式是一種行為型模式,概念是建立一個負責儲存暫存狀態的物件,可以在必要時回復最後被記錄的狀態,在應用上很廣泛比如文章編輯時暫存、參數修改時暫存,或是遊戲內的暫存紀錄點…等等。
更重要的是備忘錄模式會把暫存的狀態從原本的物件分離,可以保持原物件的功能不受影響。
範例
//**************
//* author: cian
//* 20231111
//**************
/* 系統狀態 */
enum StateEnum
{
None,
StateA,
StateB,
StateC,
StateD,
}
/* Originator */
class Originator
{
private Memento memento = new Memento();
private StateEnum _state = StateEnum.None;
public StateEnum State
{
get { return _state; }
set
{
if(_state == value) return;
_state = value;
//Do OnPropertyChanged...
}
}
public void SaveState()
{
memento.StateStored = _state;
}
public void RestoreState()
{
State = memento.StateStored;
}
class Memento
{
public StateEnum StateStored { get; set; }
}
}
class MainApp
{
static void Main(string[] args)
{
Originator origin = new Originator();
origin.State = StateEnum.StateA; //StateA
origin.State = StateEnum.StateB; //StateB
origin.SaveState();
origin.State = StateEnum.StateC; //StateC
origin.SaveState(); //roll back to StateB.
}
}
結語
可以看到備忘錄模式在C#方便的getter、setter幫助下,在Originator內加入Memento類別的意義並不大,在要被儲存屬性少的狀況下直接寫個private去記憶就可,但當需要記憶完整副本時,一個一個屬性去拷貝又很冗長笨重,這時可以搭配原型模式直接Clone一個副本也是很靈活的運用。
以上為學習過程的問題紀錄
如果文章有誤,歡迎前輩留言請不吝指教。
發佈留言