1. 程式人生 > 其它 >C++設計模式 - 備忘錄模式(Memento)

C++設計模式 - 備忘錄模式(Memento)

狀態變化模式

  • 在元件構建過程中,某些物件的狀態經常面臨變化,如何對這些變化進行有效的管理?同時又維持高層模組的穩定?“狀態變化”模式為這一問題提供了一種解決方案。

典型模式

Memento

動機(Motivation)

  • 在軟體構建過程中,某些物件的狀態在轉換過程中,可能由於某種需要,要求程式能夠回溯到物件之前處於某個點時的狀態。如果使用一一些公有介面來讓其他物件得到物件的狀態,便會暴露物件的細節實現。
  • 如何實現物件狀態的良好儲存與恢復?但同時又不會因此而破壞物件本身的封裝性。

模式定義

在不破壞封裝性的前提下,捕獲一個物件的內部狀態, 並在該物件之外儲存這個狀態。這樣以後就可以將該物件恢復到原先儲存的狀態。

結構

要點總結

  • 備忘錄( Memento )儲存原發器( Originator )物件的內部狀態,在需要時恢復原發器狀態。
  • Memento模式的核心是資訊隱藏,即Originator需要向外接隱藏資訊,保持其封裝性。但同時又需要將狀態保持到外界( Memento )。
  • 由於現代語言執行時(如C#、Java等 )都具有相當的物件序列化支援,因此往往採用效率較高、又較容易正確實現的序列化方案來實現Memento模式。

cpp

#include<iostream>

class Memento
{
private:
	std::string state_;
	//...
public:
	Memento(std::string& state) :state_(state) {}
	std::string getState()const { return state_; }
	void setState(std::string& state) { state_ = state; }
};

class Originator
{
private:
	std::string state_;
	//...
public:
	Originator() {}
	Memento createMomento()
	{
		Memento m(state_);
		return m;
	}
	void setMomento(const Memento& m)
	{
		state_ = m.getState();
	}
};


int main()
{
	Originator orginator;
	//捕獲物件狀態,儲存到備忘錄
	Memento m = orginator.createMomento();
	//... 改變orginator狀態

	//從備忘錄中恢復
	orginator.setMomento(m);	

	return 0;
}