备忘录模式(Memento)

参考:

[备忘录设计模式 (refactoringguru.cn)](https://refactoringguru.cn/design-patterns/mediator)

一、什么是备忘录模式?

在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前某个时间点的状态。如果使用一些公有接口来让其它对象得到对象的状态,便会暴露对象的细节实现。

备忘录模式定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。

例如编辑器中保存的内容,可能一些历史修改的快照,用户可以通过撤消恢复历史编辑的内容。

在这里插入图片描述

二、实现

备忘录(Memento)模式包含以下主要角色:

1、原发器(Originator):可以生成自身状态的快照, 也可以在需要时通过快照恢复自身状态。
2、备忘录(Memento):用于存储Originator角色的内部状态,且可以防止Originator以外的对象进行访问。
3、负责人(Caretaker):负责存储,管理备忘录功能。且其本身应该无法对备忘录的内容进行访问。

在这里插入图片描述

#include <iostream>
#include <string>
using namespace std;

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

class Originator
{
    string state;
public:
    Originator() {}
    Mmento creatMemento() { return Memento(state); }
    void setMemento(const Memento &m) { state = m.getState(); }
}

int main()
{
    Originator originator;
    Memento mem = originator.createMemento();
    // do something ...
    originator.setMemento(memento);
}

三、优缺点

优点

  • 可以在不破坏对象封装情况的前提下创建对象状态快照。
  • 可以通过让负责人维护原发器状态历史记录来简化原发器代码。

缺点

  • 如果客户端过于频繁地创建备忘录, 程序将消耗大量内存。
  • 负责人必须完整跟踪原发器的生命周期, 这样才能销毁弃用的备忘录。

四、适用环境

  • 当你需要创建对象状态快照来恢复其之前的状态时, 可以使用备忘录模式。
  • 当直接访问对象的成员变量、 获取器或设置器将导致封装被突破时,可以使用该模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值