设计模式(4)--对象行为(6)--备忘录

1. 意图

    在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

    这样以后可以将该对象恢复到原先保存的状态。

2. 三种角色

   原发器(Originator)、备忘录(Memento)、负责人(Caretaker)

3. 优点

   3.1 保持了封装边界。屏蔽了原发器的内部信息。

   3.2 简化了原发器。 

4. 缺点

    4.1 可能代价很高。

    当生成备忘录必须拷贝并存储大量信息时,或非常频繁地创建备忘录和恢复原发器状态。

    4.2 在一些语言中可能难于保证只有原发器可访问备忘录的状态。

    4.3 维护备忘录的潜在代价。可能产生大量的存储开销。

5. 相关模式

    5.1 命令模式可使用备忘录来为可撤销的操作维护状态。

    5.2 备忘录可用于迭代器存储状态。 

6. 代码示意(C++)
#pragma once
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Mememto
{
	string m_state;
public:
	Mememto(const string& state) {
		m_state = state;
	}
	string GetState() {
		return m_state;
	}
	void SetState(const string& state) {
		m_state = state;
	}

};

class Originator
{
	string m_state;
public:
	Mememto* CreateMememto() {
		return new Mememto(m_state);
	}
	void SetMememto(Mememto* pMememto) {
		m_state = pMememto->GetState();
	}
	void SetState(const string& state) {
		m_state = state;
	}
	void ShowState() {
		cout << "state:" << m_state << endl;
	}
};

class CareTaker
{
	Mememto* m_pMememto;
public:
	CareTaker(Mememto* pMememto) {
		m_pMememto = pMememto;
	}
	~CareTaker() {
		delete m_pMememto;
	}
	Mememto* GetMememto() {
		return m_pMememto;
	}
};
#include "Mememto.h"
int main() {
	Originator* pOriginator = new Originator();
	pOriginator->SetState("on");
	pOriginator->ShowState();

	CareTaker taker(pOriginator->CreateMememto());

	pOriginator->SetState("off");
	pOriginator->ShowState();

	pOriginator->SetMememto(taker.GetMememto());
	pOriginator->ShowState();

	delete pOriginator;
	return 0;
}

运行结果:

 

 6.1 Originator通过Mememto来保存真实的内部状态,不保留历史状态(3.2)。

 6.2 Caretaker持有有历史状态的Mememto指针,但不关注其内部状态(3.1)。

相关推荐

  1. # 设计模式 #5.6 Memento备忘录行为模式

    2023-12-28 20:24:05       12 阅读
  2. 行为设计模式备忘录模式

    2023-12-28 20:24:05       26 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-28 20:24:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-28 20:24:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-28 20:24:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-28 20:24:05       20 阅读

热门阅读

  1. 每日一题:求连续子数组的最大和

    2023-12-28 20:24:05       42 阅读
  2. Hotspot源码解析-第八章

    2023-12-28 20:24:05       38 阅读
  3. C++ string类详解 适合零基础小白

    2023-12-28 20:24:05       33 阅读
  4. 闰年显示#洛谷

    2023-12-28 20:24:05       34 阅读
  5. 过滤器的简单使用

    2023-12-28 20:24:05       43 阅读
  6. Redis单线程的正确理解(一)

    2023-12-28 20:24:05       43 阅读
  7. css吸顶(position: sticky;)

    2023-12-28 20:24:05       62 阅读
  8. 【排序算法】合并两个有序数组

    2023-12-28 20:24:05       31 阅读