意图:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
单就实现保存一个对象在某一时刻的状态的功能,还是很简单的——将对象中要保存的属性放到一个专门管理备份列表的的对象中,需要的时候则调从备份的列表中将该对象的属性放回去。但是为了能让你的备份对象访问到原对象中的属性,是否意味着你就要全部公开或者部分公开对象原本私有的属性呢?如果你的做法已经破坏了封装,那么就要考虑重构一下了。
备忘录模式的组成部分:
(1)备忘录(Memento)角色:备忘录角色存储“备忘发起角色”的内部状态。“备忘发起角色”根据需要决定备忘录角色存储“备忘发起角色”的哪些内部状态。为了防止“备忘发起角色”以外的其他对象访问备忘录。备忘录实际上有两个接口,“备忘录管理者角色”只能看到备忘录提供的窄接口——备忘录角色中存放的属性对它来讲是不可见的。“备忘发起角色”则能够看到一个宽接口——能够看到自己放入备忘录角色中属性。
(2)备忘发起(Originator)角色:“备忘发起角色”创建一个备忘录,用以记录当前时刻它的内部状态。在需要时使用备忘录恢复内部状态。
(3) 备忘录管理者(Caretaker)角色:负责保存好备忘录,但不能对备忘录的内容进行操作或检查。