Memento-Muster (C++)

Definition

Erfassen Sie den internen Zustand eines Objekts und speichern Sie diesen Zustand außerhalb des Objekts, ohne die Kapselung zu zerstören. Dadurch kann das Objekt später wieder in seinen zuvor gespeicherten Zustand versetzt werden.

Anwendungsszenario

➢Während des Softwarekonstruktionsprozesses kann es aufgrund bestimmter Anforderungen erforderlich sein, dass das Programm während des Übergangsprozesses des Status einiger Objekte an einem bestimmten Punkt zum Status des Objekts zurückkehrt. Wenn eine öffentliche Schnittstelle verwendet wird, um anderen Objekten den Zugriff auf den Status des Objekts zu ermöglichen, wird die detaillierte Implementierung des Objekts offengelegt.
➢Wie kann eine gute Erhaltung und Wiederherstellung des Objektzustands erreicht werden? Gleichzeitig wird jedoch die Kapselung des Objekts selbst nicht zerstört.

Struktur

Fügen Sie hier eine Bildbeschreibung ein

Codebeispiel

//Memento.h
/****************************************************/
#ifndef MEMENTO_H
#define MEMENTO_H
#include <iostream>

#include <unordered_map>
#include <vector>
#include <list>
#include <string>
 
using namespace std;
 
// 备忘录类-游戏进度
class Memento 
{
    
    
public:
	// 构造函数
	Memento(string state) : m_state(state) {
    
    }
 
	// 获取状态
	std::string getState() const{
    
     
		return m_state;
	}
 
private:
	std::string m_state;
};
 
// 发起类-游戏
class Game 
{
    
    
public:
	// 设置状态
	void setState(string state) {
    
     
		m_state = state;
	}
 
	// 获取状态
	string getState() {
    
     
		return m_state;
	}
 
	// 保存状态至备忘录
	Memento saveStateToMemento() {
    
     
		return Memento(m_state); 
	}
 
	// 从备忘录获取状态
	void getStateFromMemento(const Memento& memento) {
    
     
		m_state = memento.getState(); 
	}
 
private:
	std::string m_state;
};
 
// 备忘录管理类-进度管理
class CareTaker 
{
    
    
public:
	// 添加备忘录
	void addMemento(const Memento& memento) {
    
     
		m_mementos.push_back(memento);
	}
 
	// 获取备忘录
	Memento getMemento(int index) {
    
     
		return m_mementos[index];
	}
 
private:
	std::vector<Memento> m_mementos;
};

#endif
//test.cpp
/****************************************************/
#include "Memento.h"
 
int main()
{
    
    
	Game game;
	CareTaker careTaker;
	// 通关
	game.setState("进度:第一关通过");
	game.setState("进度:第二关通过");
	// 保存进度,进度被管理系统管理
	careTaker.addMemento(game.saveStateToMemento());
	// 继续通关
	game.setState("进度:第三关通过");
	// 保存进度,进度被管理系统管理
	careTaker.addMemento(game.saveStateToMemento());
	// 继续通关
	game.setState("进度:第四关通过");
	// 当前进度
	cout << "当前" << game.getState() << endl;
	// 获取首个进度
	game.getStateFromMemento(careTaker.getMemento(0));
	cout << "1)" << game.getState() << endl;
	// 获取第二个进度
	game.getStateFromMemento(careTaker.getMemento(1));
	cout << "2)" << game.getState() << endl;
	
	return 0;
}

Operationsergebnis
Fügen Sie hier eine Bildbeschreibung ein

Zusammenfassung

  • Memento speichert den internen Status des Originator-Objekts und stellt den Originator-Status bei Bedarf wieder her.
  • Der Kern des Memento-Modus besteht darin, Informationen zu verbergen. Das heißt, der Urheber muss Informationen vor der Außenwelt verbergen, um ihre Kapselung aufrechtzuerhalten. Aber gleichzeitig müssen Sie den Zustand nach außen hin bewahren (Memento).
  • Da moderne Sprachlaufzeiten (wie C#, Java usw.) über umfangreiche Objektserialisierungsunterstützung verfügen, wird das Memento-Muster häufig mit einem Serialisierungsschema implementiert, das effizienter und einfacher korrekt zu implementieren ist.

Guess you like

Origin blog.csdn.net/weixin_47424753/article/details/132147793
C++