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

2023-12-27 09:51:24
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)。

文章来源:https://blog.csdn.net/myepicure/article/details/134909975
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。