备忘录模式

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

典型的备忘录类代码
package dp.memento; class Memento { private String state; public Memento(Originator o){ state = o.state; } public void setState(String state) { this.state=state; } public String getState() { return this.state; } }
典型的管理者类代码
package dp.memento; public class Caretaker { private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento=memento; } }
备忘录模式
10103421 姚浩
备忘录模式
(1)模式动机与定义 (2)模式结构与分析 (3)模式效果与应用 (4)模式扩展
备忘录模式的定义
• 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。 • 备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对 象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对 象恢复到原先保存的状态。它是一种对象行为型模式,其别名为 Token。 – Memento Pattern: Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later. – Frequency of use: medium low
模式动机
– 为了使软件的使用更加人性化,对于误操作,我们需要提供一种 类似“后悔药”的机制,让软件系统可以回到误操作前的状态, 因此需要保存用户每一次操作时系统的状态,一旦出现误操作, 可以把存储的历史状态取出即可回到之前的状态。 – 现在大多数软件都有撤销 (Undo) 的功能,快捷键一般都是 Ctrl+Z , 目的就是为了解决这个后悔的问题。 – 我们在很多的时候做错了事情需要弥补过错,我们就会想到如果 有“后悔药”就好了,这源自文库候这个备忘录模式的强大功能就会让 我们 – “呵呵呵”解决了。
备忘录模式的结构图
模式分析
– 为了实现对备忘录对象的封装,需要对备忘录的调用进行控制:
• 对于原发器而言,它可以调用备忘录的所有信息,允许原发器访问返回到先 前状态所需的所有数据; • 对于负责人而言,只负责备忘录的保存并将备忘录传递给其他对象; • 对于其他对象而言,只需要从负责人处取出备忘录对象并将原发器对象的状 态恢复,而无须关心备忘录的保存细节。
备忘录模式的优缺点
– 备忘录模式的缺点
• 1、如果发起人角色的状态需要完整地存储到备忘录 对象中,那么在资源消耗上面备忘录对象会很昂贵。 • 2、当负责人角色将一个备忘录 存储起来的时候, 负责人可能并不知道这个状态会占用多大的存储空 间,从而无法提醒用户一个操作是否很昂贵。 • 3、当发起人角色的状态改变的时候,有可能这个协 议无效。如果状态改变的成功率不高的话,不如采 取“假如”协议模式 • 4、资源消耗过大,如果类的成员变量太多,就不可 避免占用大量的内存,而且每保存一次对象的状态 都需要消耗内存资源,如果知道这一点大家就容易 理解为什么一些提供了撤销功能的软件在运行时所 需的内存和硬盘空间比较大了。
– 在应用软件的开发过程中,很 多时候我们都需要记录一个对 象的内部状态。 – 在具体实现过程中,为了允许 用户取消不确定的操作或从错 误中恢复过来,需要实现备份 点和撤销机制,而要实现这些 机制,必须事先将状态信息保 存在某处,这样才能将对象恢 复到它们原先的状态。 – 备忘录模式是一种给我们的软 件提供后悔药的机制,通过它 可以使系统恢复到某一特定的 历史状态。
备忘录模式的优缺点:
– 备忘录模式的优点: • 提供了一种状态恢复的实现机制,使得用户 可以方便地回到一个特定的历史步骤,当新 的状态无效或者存在问题时,可以使用先前 存储起来的备忘录将状态复原。 • 实现了信息的封装,一个备忘录对象是一种 原发器对象的表示,不会被其他代码改动, 这种模式简化了原发器对象,备忘录只保存 原发器的状态,采用堆栈来存储备忘录对象 可以实现多次撤销操作,可以通过在负责人 中定义集合对象来存储多个备忘录。
– 理想的情况是只允许生成该备忘录的那个原发器访问备忘录的内部状态。
典型的发起人类代码:
package dp.memento; public class Originator { private String state; public Originator(){} // 创建一个备忘录对象 public Memento createMemento(){ return new Memento(this); } // 根据备忘录对象恢复原发器状态 public void restoreMemento(Memento m){ state = m.state; } public void setState(String state) { this.state=state; } public String getState() { return this.state; } }
涉及角色:
• 1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前 时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可 以根据需要决定Memento存储自己的哪些内部状态。 • 2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防 止Originator以外的其他对象访问备忘录。备忘录有两个接口: Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对 象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状 态所需要的所有数据。 • 3.Caretaker(管理者):负责备忘录Memento,不能对Memento的内容 进行访问或者操作。
相关文档
最新文档