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

相关推荐
钦拆大仁5 小时前
Java设计模式-单例模式
java·单例模式·设计模式
娟宝宝萌萌哒13 小时前
智能体设计模式重点
人工智能·设计模式
Andy&lin14 小时前
【医疗】智慧病房APP原型模板
设计模式·产品运营·人机交互·交互·健康医疗
Engineer邓祥浩14 小时前
设计模式学习(22) 23-20 解释器模式
学习·设计模式·解释器模式
钦拆大仁14 小时前
Java设计模式-状态模式
java·设计模式·状态模式
Engineer邓祥浩14 小时前
设计模式学习(24) 23-22 策略模式
学习·设计模式·策略模式
我真的是大笨蛋15 小时前
MVCC解析
java·数据库·spring boot·sql·mysql·设计模式·设计规范
Engineer邓祥浩16 小时前
设计模式学习(25) 23-23 责任链模式
学习·设计模式·责任链模式
半桔16 小时前
【设计模式】策略模式:可插拔算法,从硬编码到灵活适配,体会“算法解耦“思想
java·c++·算法·设计模式·策略模式
Engineer邓祥浩16 小时前
设计模式学习(23) 23-21 状态模式
学习·设计模式·状态模式