Memento パターン

Memento パターン - Wikipedia

オブジェクトを以前の状態に(ロールバックにより)戻す能力を提供、要するにわかりやすい例だとCtrl+Zですね。Caretakerが戻すための状態(Memento)の保持を行い、Originatorが自分の状態を元に戻す仕事を担当するというように役割分担が実施されている。

以下のコードはwikipediaにあったコードをC++に書きなおしたもの。

#include<iostream>
#include<string>
#include<List>
using namespace std;
//Memento 
class Memento {
public : 
	Memento(string state){
		this->state_ = state;
	}
	string GetSavedState(){
		return state_;
	}
private : 
	string state_; 
};
//Originator
class Originator {
public : 
	void Set(string state) { 
		cout << "Originator: Setting state to " + state << endl;
		this->state_ = state; 
	}
	Memento * SaveToMemento() { 
		cout << "Originator: Saving to Memento." << endl;
		return new Memento(state_); 
	}
	void RestoreFromMemento(Memento *memento){
		this->state_ = memento->GetSavedState(); 
		delete memento;
		cout <<  "Originator: State after restoring from Memento: " + state_ << endl;
	}
private : 
	string state_;
};
//Caretaker 
class Caretaker
{
public : 
	void AddMemento(Memento *memento){
		savedStates_.push_back(memento); 
	}
	Memento * GetMemento(){
		Memento * result = savedStates_.back();
		savedStates_.pop_back();
		return result;
	}
	~Caretaker(){
		for(list<Memento*>::iterator itr = savedStates_.begin(); itr != savedStates_.end(); itr++){
			delete (*itr);
		}
	}
private : 
	list<Memento*> savedStates_;
}; 

int main()
{
	Caretaker *caretaker = new Caretaker();

	Originator *originator = new Originator();
	originator->Set("State1");
	originator->Set("State2");
	caretaker->AddMemento( originator->SaveToMemento() );
	originator->Set("State3");
	caretaker->AddMemento( originator->SaveToMemento() );
	originator->Set("State4");
	originator->RestoreFromMemento(caretaker->GetMemento());
	originator->RestoreFromMemento(caretaker->GetMemento());

	delete caretaker;
	delete originator;

	return 0;
}