跳至主要內容

《C++设计模式》视频_李建忠

LincZero大约 3 分钟

《C++设计模式》视频_李建忠

目录

[toc]

备忘录 Memento

英语小笔记

  • -mem-,记录记忆的意思
    • memento,备忘录,纪念品
    • memory,记忆,内存
    • member,成员、家庭成员
    • remember,记得
      • remind,提醒
      • remaid,剩下

所属分类——“状态变化” 模式

动机(Motivation)

简概

  • 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。 如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。
  • 如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。

代码体现

需要给对象拍一个快照

举例 - 代码(备忘录模式)

class Memento									// 备忘录类
{
	string state;
    //...
public:
	Memento(const string & s) : state(s) {}		// 存入状态
    string getState() const {return state;}		// 取出状态
	void setstate(const string & s){state = s;}	// 存入状态(此处该函数同构造函数)
};

class 0riginator								// 起源,需要被保存的类
{
	string state;
    //...
public:
	0riginator() {}
	Memento createMomento( ) {					// 【快照】
		Memento m(state) ;						// 传入state,并创建备忘录类。这个过程实际中可能会比较复杂
		return m;
	}
	void setMomento(const Memento & m) {		// 【恢复】
        state = m.getState();					// 从备忘录中恢复状态
    }
};

int main()
{
    Originator orginator;
    
    // 存储到备忘录
    Memento mem = orginator.createMomento();
    
    // ... 改变orginator状态
    
    // 从备忘录中恢复
    orginator.setMomento(memento);
}

设计模式

模式定义

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

——《设计模式》GoF

结构(Structure)

要点总结

  • 备忘录(Memento)存储原发器(Originator)对象的内部状态,在需要时恢复原发器状态
  • Memento模式的核心是信息隐藏,即Originator需要向外接隐藏信息,保持其封装性。但同时又需要将状态保持到外界(Memento)
  • 由于现代语言运行时(如C#、Java等)都具有相当的对象序列化支持,因此往往采用效率较高、又较容易正确实现的序列化方案来实现Memento模式

个人总结

有人认为这种模式比较过时,毕竟这种模式是94年提出来的,95年才有Java。Java好像可以用反射来做?)

这个模式理解起来挺简单的,实现可能会比较复杂。也有点像原型模式