在軟體開發過程中,我們經常面臨這樣的需求:必須保存物件在某一時刻的狀態,以便日後能夠撤銷操作或恢復到歷史版本。典型場景包括文檔編輯器的「復原/重做」功能、資料庫交易的回滾機制、遊戲中的存檔讀檔系統等。若直接暴露物件內部狀態供外部存取,將嚴重違反封裝原則,導致系統耦合度過高且難以維護。此時,備忘錄模式便成為了最佳解決方案。
備忘錄模式在不破壞封裝性的前提下,捕獲並外部化物件的內部狀態,使其以後可以恢復到這些狀態。其核心包含三大角色:

以下以文檔版本管理為例,展示如何在 C# 中實現備忘錄模式。
public class Document
{
public string Content { get; set; }
///
/// 創建備忘錄,保存當前文檔內容
///
public DocumentVersion CreateMemento()
{
return new DocumentVersion(Content);
}
///
/// 從備忘錄恢復文檔狀態
///
public void SetMemento(DocumentVersion documentVersion)
{
Content = documentVersion.Content;
}
}
public class DocumentVersion
{
public string Content { get; private set; }
public DocumentVersion(string content)
{
Content = content;
}
}
public class Caretaker
{
private readonly Dictionary<int, DocumentVersion> _mementoList = new Dictionary<int, DocumentVersion>();
///
/// 獲取指定版本的文檔
///
public DocumentVersion GetDocumentVersion(int versionId)
{
return _mementoList[versionId];
}
///
/// 新增文檔版本,自動生成遞增版本號
///
public void AddDocumentVersion(DocumentVersion documentVersion)
{
int maxVersionId = _mementoList.Keys.Count == 0 ? 0 : _mementoList.Keys.Max();
_mementoList.Add(maxVersionId + 1, documentVersion);
}
}
備忘錄模式適用於以下情境:
備忘錄模式的核心思想在於「將狀態封裝於備忘錄物件中,由管理者統一保管,發起人按需恢復」。在實際開發中,它廣泛應用於資料庫事務處理、編輯器撤銷功能、遊戲存檔系統等場景。掌握此模式,能幫助我們設計出更具彈性、可維護性的軟體架構。