23种设计模式 3 行为型模式 之3.5 memento 备忘录/快照模式

参考1 网友k_eckel 的书籍《设计模式精讲-GoF 23种设计模式解析附C++实现源码》

参考2 腾讯元宝问答

参考3 github copilot问答

文章目录

  • [0 前言](#0 前言)
  • [1 问题](#1 问题)
  • [2 模式选择](#2 模式选择)
  • [3 实现](#3 实现)
    • [3.1 memento.h](#3.1 memento.h)
    • [3.2 memento.cpp](#3.2 memento.cpp)
    • [3.3 main.cp](#3.3 main.cp)
    • [3.4 原作者对代码说明](#3.4 原作者对代码说明)
  • [4 讨论](#4 讨论)
  • [5 总结](#5 总结)

0 前言

memento 模式,备忘录模式/快照模式。

实现操做的撤销功能。

1 问题

没有人想犯错,但没有人能够不犯错。犯错了一般只能改过,却很难改正(恢复)。

在软件系统的设计时,要给用户后悔的权力,一些操做,肯定需要提供诸如撤销(Undo)操做。

memento 模式就是为了提供撤销操做。

2 模式选择

memento模式的关键就是,不破化封装行的前提下,捕获并保存一个类的内部状态,这样就可以利用该保存的状态试试恢复操做。

(为了达到这个目标,可以在后面的实现中看到我们采取了一定语言支持的技术。)

3 实现

3.1 memento.h

cpp 复制代码
#ifndef __MEMENTO_H_
#define __MEMENTO_H_

#include <string>
using namespace std;

class memento;

class originator
{
public:
        typedef string state;
        originator();
        originator(const state& sdt);
        ~originator();
        memento* create_memento();
        void set_memento(memento* men);
        void restore_to_memento(memento* mt);
        state get_state();
        void set_state(const state& sdt);
        void print_state();
protected:

private:
        state _sdt;
        memento* _mt;

};

class memento
{
public:

protected:

private:
//这里最关键的地方,将originator 为 friend类, 可以访问内部信息,但是其他类不能访问
        friend class originator;
        typedef string state;
        memento();
        memento(const state& sdt);
        ~memento();
        void set_state(const state& sdt);
        state get_state();
private:
        state _sdt;
};

#endif //~~ __MEMENTO_H_

3.2 memento.cpp

cpp 复制代码
#include "memento.h"
#include <iostream>

using namespace std;
typedef string state;

originator::originator()
{
        _sdt = "";
        _mt = 0;

}

originator::originator(const state& sdt)
{
        _sdt = "";
        _mt = 0;

}

originator::~originator()
{

}

memento* originator::create_memento()
{
        return new memento(_sdt);
}

state originator::get_state()
{
        return _sdt;
}

void originator::set_state(const state& sdt)
{
        _sdt = sdt;
}

void originator::print_state()
{
        cout << this-> _sdt << "......" << endl;
}

void originator::set_memento(memento* men)
{

}

void originator::restore_to_memento(memento* mt)
{
        this->_sdt = mt->get_state();
}

//class memento
memento::memento()
{

}

memento::memento(const state& sdt)
{
        _sdt = sdt;
}

state memento::get_state()
{
        return _sdt;
}

void memento::set_state(const state& sdt)
{
        _sdt = sdt;
}

3.3 main.cp

cpp 复制代码
#include "memento.h"
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
        originator* o = new originator();
        o->set_state("old");//被往前状态
        o->print_state();

        memento* m = o->create_memento();//将状态备忘
        o->set_state("new");//修改状态
        o->print_state();
        o->restore_to_memento(m);
        o->print_state();

        return 0;
}

运行结果

3.4 原作者对代码说明

4 讨论

原作者内容

5 总结

memento模式(备忘录模式)解决的问题:用户的撤销操做;

这里实现的方式:

memento和originator 相互包含共同的可撤销元素;

memento的friend class来保证mement封装性。

originator

提供方法来生成快照memento来保存originator状态;

提供方法来还原memento状态到originator

相关推荐
灰子学技术9 小时前
Envoy 使用的设计模式技术文档
设计模式
Carl_奕然19 小时前
【智能体】Agent的四种设计模式之:ReAct
人工智能·设计模式·语言模型
二哈赛车手21 小时前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式
楼田莉子21 小时前
仿Muduo的高并发服务器:Channel模块与Poller模块
linux·服务器·c++·学习·设计模式
geovindu2 天前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
嵌入式学习_force2 天前
02_state
设计模式·蓝牙
qcx232 天前
Warp源码深度解析(七):Token预算策略——双轨计费、上下文溢出与摘要压缩
人工智能·设计模式·rust·wrap
Cosolar2 天前
提示词工程面试题系列 - Zero-Shot Prompting 和 Few-Shot Prompting 的核心区别是什么?
人工智能·设计模式·架构
geovindu3 天前
go:Template Method Pattern
开发语言·后端·设计模式·golang·模板方法模式
钝挫力PROGRAMER3 天前
贫血模型的改进
java·开发语言·设计模式·架构