C++设计模式:备忘录模式(编辑器的“保存”和“撤销”)

什么是备忘录模式?

备忘录模式是一种行为型设计模式,它的主要目标是:在不破坏封装的前提下,捕获一个对象的内部状态,并在以后需要时恢复到该状态

换句话说,备忘录模式允许你保存对象的快照,并在需要时恢复它。


通俗解释

想象一个文本编辑器有“保存”和“撤销”功能:

  1. 当用户点击“保存”时,编辑器会保存当前的文本内容和光标位置。
  2. 如果用户点击“撤销”,编辑器会恢复到上一次保存的状态。

在备忘录模式中:

  • 编辑器是“发起人”对象,负责保存和恢复状态。
  • 备忘录存储状态的快照。
  • 管理者负责存储和管理备忘录(如保存历史记录)。

备忘录模式的特点

核心思想

将对象的状态保存到一个独立的备忘录对象中,从而可以在未来恢复状态。

优点
  1. 状态恢复:允许对象回滚到以前的状态。
  2. 封装性:备忘录对象独立于发起人,外界无法直接访问发起人的内部状态。
  3. 简化复杂操作:撤销/重做功能的实现变得非常直观。
缺点
  1. 内存开销:每次保存状态都会创建备忘录,可能占用大量内存。
  2. 实现复杂性:如果需要频繁保存复杂对象的状态,备忘录的管理会变得困难。

备忘录模式的结构

UML 类图
      +---------------------+
      |    Originator       |  // 发起人
      +---------------------+
      | - state: string     |  // 状态
      | + saveState()       |  // 保存状态
      | + restoreState(m)   |  // 恢复状态
      +---------------------+
                 ^
                 |
      +---------------------+
      |    Memento          |  // 备忘录
      +---------------------+
      | + getState()        |
      +---------------------+
                 ^
                 |
      +---------------------+
      |    Caretaker        |  // 管理者
      +---------------------+
      | - mementos: list    |  // 管理备忘录
      | + addMemento(m)     |
      | + getMemento(index) |
      +---------------------+

角色说明

  1. Originator(发起人)

    • 负责创建备忘录和恢复状态。
    • 保存的状态可以是任何需要回滚的对象属性。
  2. Memento(备忘录)

    • 存储发起人对象的状态快照。
    • 提供一个接口,让发起人可以恢复到以前的状态。
  3. Caretaker(管理者)

    • 负责存储和管理备忘录。
    • 不直接操作备忘录的内容,只负责存储和检索备忘录。

备忘录模式的优缺点

优点
  1. 解耦:发起人和管理者相互独立,符合单一职责原则。
  2. 恢复状态:可以方便地实现撤销/重做功能。
  3. 封装性:备忘录封装了状态,外部无法访问。
缺点
  1. 内存开销大:每次保存状态都会占用内存。
  2. 实现复杂:需要维护备忘录列表,并确保备忘录的完整性。

案例:文本编辑器的“保存”和“撤销”功能

需求描述

设计一个简单的文本编辑器,支持以下功能:

  1. 保存当前的文本内容(快照)。
  2. 撤销到之前保存的状态。

完整代码实现

以下是备忘录模式在文本编辑器场景中的应用。

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

// 备忘录类:存储文本状态
class Memento {
   
   
private:
    std::string state; // 保存的文本内容

public:
    explicit Memento(const std::string& state) : state(state) {
   
   }

    std::string getState() const {
   
   
        return state; // 返回保存的文本状态
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客晨风

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值