C++设计模式——备忘录模式(memento pattern)

本文深入探讨C++中的备忘录模式,包括其原理、应用场景、UML结构图及参与者角色。通过实例代码展示了如何创建备忘录、原发器和管理者,同时提供了两种实现方式。总结了备忘录模式的优点和缺点,如状态回退功能、封装性以及潜在的内存和CPU消耗问题。
摘要由CSDN通过智能技术生成

博主看了许多文章和一些书,发现要么代码不全,要么对备忘录的理解有偏差,要么干脆根本就不是备忘录模式,经过博主查阅十余篇文章和详细研究书本备忘录模式,总结出这篇精华的c++备忘录模式文章,感兴趣的朋友可以阅读和提出建议。

一、原理讲解

别名Token。

1.1意图

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

1.2应用场景

  • 必须保存一个对象在某时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态;
  • 如果一个接口让其它对象直接得到这些状态,将会暴露对象的实现细节并且破坏对象的封装性;

1.3结构图(UML图)

备忘录模式UML结构图

1.4参与者

1.4.1备忘录(Memento)

  • 存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态;
  • 防止原发器以外的其他对象访问备忘录。备忘录实际上有两个接口,管理者(caretaker)只能看到备忘录的窄接口(它只能将备忘录传递给其它对象)。相反,原发器能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。理想情况只允许生成备忘录那个原发器访问本备忘录;

1.4.2原发器(Originator)

  • 创建一个备忘录,记录它的当前时刻得内部状态;
  • 使用备忘录恢复内部状态;

1.4.3管理者(caretaker)

  • 负责保存好备忘录;
  • 不能对备忘录的内容进行操作或者检查;

1.5代码实现步骤

a1 定义一个备忘录类Memento,定义两个接口函数getState()和setState();
a2 定义一个原发器类Originator,定义两个接口函数createMemento()和setMemento();前一个函数被管理者类的存储函数调用Caretaker::save(),后一个函数被管理者类的恢复函数调用Caretaker::undo();
a3 定义一个管理者类Caretaker(),定义两个接口函数save()和undo();前一个函数用于存储对象当前状态,后一个函数用于对象恢复某一时刻状态;

二、实现代码

2.1实例简单阐述

本文为了简化代码,凸显出状态模式代码思想和思路,用std::sting state为对象,保存对象state当前状态和恢复对象state最开始状态,具体可以查看下面代码实现。

2.2具体实例代码

具体的实现由两个版本,一个将Originator声明为Memnto的友元类,另一个是Memnto直接提供公共接口以供窄接口调用。

2.2.1版本1 黑盒模式:将Originator声明为Memnto的友元类,Memnto接口声明为私有

MementoPattern.cpp

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

using namespace std;

#define DELETE(pointer) delete (pointer); (pointer)=nullptr

class Originator;

class Memento // 备忘录类
{
   
public:
	~Memento(){
   }
	// 提供窄接口,以供管理者类Caretaker调用
private: // 所有接口和变量声明为私有,目的是为了只提供给产生这个备忘录的原发器Originator调用,其它接口无法直接调用
	friend Originator; // 目的是为了访问Memnto的private和protected成员函数和成员变量
	string state;
	Memento(string state) :state(state) {
   }
	const string getState() const {
    return state; }
	void setState(string state) {
    this->state = state; }
};

class Originator // 原发器类
{
   
	string state;
public:
	Originator(string state) :state(state){
   }
	Memento* createMemento() {
    return new Memento(state); } // 返回对象state当前状态
	void setMemento(Memento *memento) {
    state = memento->getState(); } // 设置对象state返回某一时刻状态
	void changeState
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三公子Tjq

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值