C++中的备忘录模式

embedded/2024/10/25 18:28:30/

目录

备忘录模式(Memento Pattern)

实际应用

文本编辑器的撤销功能

游戏角色状态保存和恢复

图形编辑器的撤销/重做功能

总结


备忘录模式(Memento Pattern)

备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下捕获和恢复对象的内部状态。这个模式的主要目的是保存对象的某个状态,以便在适当的时候恢复对象到之前的状态。备忘录模式主要包含三个角色:
1. Originator:负责创建一个备忘录(Memento),用以记录当前的内部状态,并在需要时使用备忘录恢复内部状态。
2. Memento:备忘录,负责存储Originator的内部状态。
3. Caretaker:负责保存备忘录,但不能对备忘录的内容进行操作或检查。

实际应用

文本编辑器的撤销功能

-- 文本编辑器,支持撤销操作。

#include <iostream>
#include <vector>
#include <string>// Memento类,用于存储文本编辑器的状态
class Memento {
private:std::string state;public:Memento(const std::string& state) : state(state) {}std::string getState() const { return state; }
};// Originator类,表示文本编辑器
class TextEditor {
private:std::string text;public:void write(const std::string& words) {text += words;}std::string getText() const {return text;}Memento save() const {return Memento(text);}void restore(const Memento& memento) {text = memento.getState();}
};// Caretaker类,用于管理Memento
class Caretaker {
private:std::vector<Memento> history;public:void save(const Memento& memento) {history.push_back(memento);}Memento undo() {if (!history.empty()) {Memento memento = history.back();history.pop_back();return memento;}return Memento(""); // 返回空的Memento}
};// 客户端代码
int main() {TextEditor editor;Caretaker caretaker;editor.write("Hello ");caretaker.save(editor.save());editor.write("World!");caretaker.save(editor.save());std::cout << "Current Text: " << editor.getText() << std::endl;editor.restore(caretaker.undo());std::cout << "After Undo: " << editor.getText() << std::endl;editor.restore(caretaker.undo());std::cout << "After Undo: " << editor.getText() << std::endl;return 0;
}

游戏角色状态保存和恢复

-- 模拟一个游戏角色的状态保存和恢复功能。

#include <iostream>
#include <vector>
#include <string>// Memento类,用于存储游戏角色的状态
class Memento {
private:int health;int mana;int experience;public:Memento(int health, int mana, int experience): health(health), mana(mana), experience(experience) {}int getHealth() const { return health; }int getMana() const { return mana; }int getExperience() const { return experience; }
};// Originator类,表示游戏角色
class GameCharacter {
private:int health;int mana;int experience;public:GameCharacter(int health, int mana, int experience): health(health), mana(mana), experience(experience) {}void setState(int health, int mana, int experience) {this->health = health;this->mana = mana;this->experience = experience;}void displayState() const {std::cout << "Health: " << health << ", Mana: " << mana<< ", Experience: " << experience << std::endl;}Memento save() const {return Memento(health, mana, experience);}void restore(const Memento& memento) {health = memento.getHealth();mana = memento.getMana();experience = memento.getExperience();}
};// Caretaker类,用于管理Memento
class Caretaker {
private:std::vector<Memento> savepoints;public:void save(const Memento& memento) {savepoints.push_back(memento);}Memento load() {if (!savepoints.empty()) {Memento memento = savepoints.back();savepoints.pop_back();return memento;}return Memento(100, 100, 0); // 返回初始状态}
};// 客户端代码
int main() {GameCharacter character(100, 50, 0);Caretaker caretaker;character.displayState();caretaker.save(character.save());character.setState(80, 40, 10);character.displayState();caretaker.save(character.save());character.setState(50, 30, 20);character.displayState();character.restore(caretaker.load());character.displayState();character.restore(caretaker.load());character.displayState();return 0;
}

图形编辑器的撤销/重做功能

-- 图形编辑器,支持撤销和重做操作。

#include <iostream>
#include <vector>
#include <string>
#include <stack>// Memento类,用于存储图形编辑器的状态
class Memento {
private:std::vector<std::string> shapes;public:Memento(const std::vector<std::string>& shapes) : shapes(shapes) {}std::vector<std::string> getState() const { return shapes; }
};// Originator类,表示图形编辑器
class GraphicEditor {
private:std::vector<std::string> shapes;public:void addShape(const std::string& shape) {shapes.push_back(shape);}void displayShapes() const {for (const auto& shape : shapes) {std::cout << shape << " ";}std::cout << std::endl;}Memento save() const {return Memento(shapes);}void restore(const Memento& memento) {shapes = memento.getState();}
};// Caretaker类,用于管理Memento
class Caretaker {
private:std::stack<Memento> undoStack;std::stack<Memento> redoStack;public:void save(const Memento& memento) {undoStack.push(memento);while (!redoStack.empty()) {redoStack.pop();}}Memento undo() {if (!undoStack.empty()) {Memento memento = undoStack.top();undoStack.pop();redoStack.push(memento);return memento;}return Memento(std::vector<std::string>()); // 返回空的Memento}Memento redo() {if (!redoStack.empty()) {Memento memento = redoStack.top();redoStack.pop();undoStack.push(memento);return memento;}return Memento(std::vector<std::string>()); // 返回空的Memento}
};// 客户端代码
int main() {GraphicEditor editor;Caretaker caretaker;editor.addShape("Circle");caretaker.save(editor.save());editor.addShape("Square");caretaker.save(editor.save());editor.addShape("Triangle");caretaker.save(editor.save());std::cout << "Current Shapes: ";editor.displayShapes();editor.restore(caretaker.undo());std::cout << "After Undo: ";editor.displayShapes();editor.restore(caretaker.undo());std::cout << "After Undo: ";editor.displayShapes();editor.restore(caretaker.redo());std::cout << "After Redo: ";editor.displayShapes();editor.restore(caretaker.redo());std::cout << "After Redo: ";editor.displayShapes();return 0;
}

总结

备忘录模式帮助我们在不破坏对象封装性的前提下捕获和恢复对象的内部状态,从而实现撤销和重做操作。


http://www.ppmy.cn/embedded/50254.html

相关文章

Leetcode面试经典150题

汇总区间 class Solution { public:vector<string> summaryRanges(vector<int>& nums) {int n nums.size();if (n 0) {return {};}vector<string> res;string str to_string(nums[0]);int start nums[0];int gap 1;for (int i 1; i < n; i) {i…

AI导航网

文章目录 1、[AI导航网](https://www.ainav.cn/) 1、AI导航网 https://www.ainav.cn/

相似性搜索揭秘:向量嵌入与机器学习应用

引言 在当今数据驱动的世界中&#xff0c;有效地检索和利用信息是一项关键挑战。在数据库、搜索引擎和众多应用程序中&#xff0c;寻找相似数据是一项基本操作。传统数据库中&#xff0c;基于固定数值标准的相似项搜索相对直接&#xff0c;通过查询语言即可实现&#xff0c;如…

6.14作业

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数&#xff0c;将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"…

Python面试宝典:Python中与常用的机器学习库相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第二十六章:Python与数据科学:第三节:Python中常用的机器学习库】 第二十六章:Python与数据科学第三节:Python中常用的机器学习库1. Scikit-learn2. TensorFlow3. PyTorch4. Keras5.…

Flutter图像编辑器应用:创造生动美丽的照片体验

介绍 引言 想象一下&#xff0c;在一个阳光明媚的下午&#xff0c;与家人或朋友漫步在风景如画的街道上。拿出手机&#xff0c;迫不及待地捕捉这一刻的美好&#xff0c;按下快门&#xff0c;留下了一张充满回忆的照片。 然而&#xff0c;回到家后发现照片的亮度有些偏暗&…

Web前端开发的过程:深入剖析与精彩演绎

Web前端开发的过程&#xff1a;深入剖析与精彩演绎 在数字化时代&#xff0c;Web前端开发作为构建用户界面的关键环节&#xff0c;其重要性不言而喻。这一过程涉及众多技术细节和创意构思&#xff0c;充满了挑战与机遇。本文将从四个方面、五个方面、六个方面和七个方面&#…

计算机网络简答题

第一章 计算机网络 1.因特网是一个世界范围的计算机网络,记一个互联了遍及全世界的计算机设备的网络。 2.计算机网络将众多分散的、自治的(一台坏了不影响其他)计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。 3.计算机网络的组…