iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

定義


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)功能,以便用戶可以退回到以前的操作狀態或重新執行操作。
這就是備忘錄模式可以解決的問題。

備忘錄模式的主要元素


  1. Originator(發起人):
    這是需要保存狀態的物件。它擁有一個內部狀態,並且可以創建Memento物件以保存現在的狀態,也可以使用Memento物件來恢復狀態。

  2. Memento(備忘錄):
    這是用來保存Originator狀態的物件。Memento物件通常包含一個或多個狀態的屬性,以及一個用於存取或修改這些狀態的方法。

  3. Caretaker(管理者):
    這是負責管理Memento的物件。Caretaker可以保存多個Memento物件,並根據需求將它們提供給Originator以恢復狀態。

UML


C#例子


以下是一個使用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:


上一篇
[Day23] Design Pattern - Mediator中介者模式
下一篇
[Day25] Design Pattern - Observer觀察者模式
系列文
Design Pattern - 無所不在的設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言