备忘录模式

简介: 备忘录模式(Memento Pattern)是一种行为设计模式,用于在不暴露对象内部状态的情况下,捕获并存储对象的当前状态,以便日后可以将对象恢复到存储的状态。该模式主要由三个角色组成:发起人(Originator)、备忘录(Memento)和管理者(Caretaker)。发起人负责创建和恢复备忘录,备忘录存储发起人的状态,管理者则负责保存备忘录但不修改其内容。备忘录模式常用于支持撤销/恢复操作,如文本编辑器、游戏状态管理等。优点包括封装性好、支持撤销/恢复操作,但缺点是可能消耗较多资源。

备忘录模式

概念

备忘录模式(Memento Pattern)是一种行为设计模式,用于在不暴露对象内部状态的情况下,捕获并存储对象的当前状态,以便日后可以将对象恢复到存储的状态。备忘录模式可以有效地实现撤销/恢复操作。


组件和职责

组件 描述
Originator(发起人) 定义一个创建备忘录和恢复备忘录的接口,记录并还原对象状态。
Memento(备忘录) 存储发起人的状态,提供发起人访问但对其他对象不可见,确保封装性。
Caretaker(管理者) 负责保存备忘录但不修改它的内容,通常通过栈或列表记录状态以支持多步撤销或恢复操作。

使用场景

使用场景 描述
需要保存对象状态 需要将对象状态保存到外部存储但不暴露内部实现细节。
支持撤销/恢复功能 允许用户撤销某些操作并恢复到之前的状态,如文本编辑器、游戏状态管理等。
复杂对象状态管理 状态的保存和恢复需要被系统有效管理,避免直接操作对象的内部实现。

优点与缺点

优点 缺点
封装性:保持对象的封装性,外部无法访问内部状态。 存储开销:保存多个备忘录可能消耗较多资源。
撤销/恢复:支持轻松撤销和恢复操作。 实现复杂性:设计和管理备忘录存储结构复杂。
操作简单:发起人通过接口即可实现状态保存与恢复。 过多备忘录:历史记录过多可能影响性能。

与其他模式的比较

特性 备忘录模式 命令模式
主要作用 保存和恢复对象状态 将操作封装为对象,支持撤销和记录。
状态管理 专注于对象状态的存储和恢复 通过执行命令的撤销方法管理状态。
操作与状态的分离 将状态存储和操作逻辑分开 将操作封装为命令对象,与状态解耦。

实现代码

C++ 实现

#include <iostream>
#include <string>
#include <vector>

// Memento
class Memento {
private:
   std::string state;

public:
   Memento(const std::string& s) : state(s) {}
   std::string getState() const { return state; }
};

// Originator
class Originator {
private:
   std::string state;

public:
   void setState(const std::string& s) { state = s; }
   std::string getState() const { return state; }

   Memento saveToMemento() { return Memento(state); }
   void restoreFromMemento(const Memento& memento) { state = memento.getState(); }
};

// Caretaker
class Caretaker {
private:
   std::vector<Memento> mementoList;

public:
   void addMemento(const Memento& memento) { mementoList.push_back(memento); }
   Memento getMemento(size_t index) { return mementoList.at(index); }
};

// Example
int main() {
   Originator originator;
   Caretaker caretaker;

   originator.setState("State1");
   caretaker.addMemento(originator.saveToMemento());

   originator.setState("State2");
   caretaker.addMemento(originator.saveToMemento());

   originator.setState("State3");

   std::cout << "Current State: " << originator.getState() << std::endl;

   originator.restoreFromMemento(caretaker.getMemento(0));
   std::cout << "Restored to: " << originator.getState() << std::endl;

   return 0;
}


C# 实现

using System;
using System.Collections.Generic;

// Memento
class Memento {
   public string State { get; private set; }
   public Memento(string state) {
       State = state;
   }
}

// Originator
class Originator {
   public string State { get; set; }

   public Memento SaveToMemento() {
       return new Memento(State);
   }

   public void RestoreFromMemento(Memento memento) {
       State = memento.State;
   }
}

// Caretaker
class Caretaker {
   private List<Memento> _mementos = new List<Memento>();

   public void AddMemento(Memento memento) {
       _mementos.Add(memento);
   }

   public Memento GetMemento(int index) {
       return _mementos[index];
   }
}

// Example
class Program {
   static void Main() {
       Originator originator = new Originator();
       Caretaker caretaker = new Caretaker();

       originator.State = "State1";
       caretaker.AddMemento(originator.SaveToMemento());

       originator.State = "State2";
       caretaker.AddMemento(originator.SaveToMemento());

       originator.State = "State3";

       Console.WriteLine($"Current State: {originator.State}");

       originator.RestoreFromMemento(caretaker.GetMemento(0));
       Console.WriteLine($"Restored to: {originator.State}");
   }
}


类图

image.png

目录
相关文章
|
3月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
6月前
|
设计模式 存储 Java
Java设计模式之备忘录模式详解
Java设计模式之备忘录模式详解
|
7月前
|
设计模式 存储 Java
聊聊Java设计模式-备忘录模式
备忘录模式(Memento Design Pattern),也叫快照(Snapshot)模式。指在不违背封装原则前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。
66 0
聊聊Java设计模式-备忘录模式
|
7月前
|
存储 设计模式 Java
|
7月前
|
设计模式 安全 C++
行为型 备忘录模式
行为型 备忘录模式
49 1
|
设计模式 存储 Java
Java设计模式-备忘录模式(Memento)
Java设计模式-备忘录模式(Memento)
|
设计模式
我学会了,备忘录模式
备忘录模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
149 0
我学会了,备忘录模式
|
设计模式 存储 Java
Java设计模式 ->备忘录模式
Java设计模式 ->备忘录模式
105 0
|
存储 程序员 开发工具
状态模式与备忘录模式(2)
状态模式与备忘录模式(2)
148 0
状态模式与备忘录模式(2)
|
存储 Java Spring
状态模式与备忘录模式(3)
状态模式与备忘录模式(3)
143 0
状态模式与备忘录模式(3)