Memento is a behavioral design pattern that lets you save and restore the previous state of an object without revealing the details of its implementation.
--Refactoring Guru
備忘錄模式是一種行為型設計模式,它允許你在不揭露實作的細節的情況下,儲存且恢復物件德原始狀態。
舉例來說~
假設有一個文字編輯器,你可以在其中編輯文字並進行各種操作,例如添加文字、刪除文字、格式化等等。
我們希望實現"撤銷"(Undo)和"重做"(Redo)功能,以便用戶可以退回到以前的操作狀態或重新執行操作。
這就是備忘錄模式可以解決的問題。
Originator(發起人):
這是需要保存狀態的物件。它擁有一個內部狀態,並且可以創建Memento物件以保存現在的狀態,也可以使用Memento物件來恢復狀態。
Memento(備忘錄):
這是用來保存Originator狀態的物件。Memento物件通常包含一個或多個狀態的屬性,以及一個用於存取或修改這些狀態的方法。
Caretaker(管理者):
這是負責管理Memento的物件。Caretaker可以保存多個Memento物件,並根據需求將它們提供給Originator以恢復狀態。
以下是一個使用C#實作Memento設計模式的簡單範例~
模擬了一個簡單的文字編輯器,可以保存和恢復文字的狀態。
首先是Originator
// Originator: 文字編輯器
class TextEditor
{
private string text;
public TextEditor()
{
text = "";
}
public void WriteText(string newText)
{
text += newText;
}
public void ShowText()
{
Console.WriteLine("Current Text: " + text);
}
// 創建備忘錄
public TextMemento CreateMemento()
{
return new TextMemento(text);
}
// 恢復備忘錄
public void RestoreFromMemento(TextMemento memento)
{
text = memento.GetSavedText();
}
}
再來是Memento
// Memento: 文字備忘錄
class TextMemento
{
private string savedText;
public TextMemento(string text)
{
savedText = text;
}
public string GetSavedText()
{
return savedText;
}
}
最後是CareTaker
// Caretaker: 管理備忘錄
class TextEditorHistory
{
public TextMemento Memento { get; set; }
}
class Program
{
static void Main(string[] args)
{
TextEditor editor = new TextEditor();
TextEditorHistory history = new TextEditorHistory();
// 編輯文字
editor.WriteText("Hello, ");
editor.ShowText();
// 創建備忘錄並保存當前狀態
history.Memento = editor.CreateMemento();
// 繼續編輯文字
editor.WriteText("World!");
editor.ShowText();
// 恢復到之前的狀態
editor.RestoreFromMemento(history.Memento);
editor.ShowText();
}
}
output: