1 / 15

Design Patterns ---Memento

Design Patterns ---Memento. Design Patterns classification:. 行为模式. 创建模式. 备忘录模式. 结构模式. 备忘录 :. 定义及目的 类 图 结构 使用举例 适用 情况 缺陷. 1. 定义. 备忘录是这样一种模式: 在不破坏 封装性 的前提下,捕获一个对象的 内部状态 ,并在该对象之外 保存 这个状态。这样以后就可将该对象 恢复 到原先保存的状态。 2. 目的 想要 恢复 对象某时的 原有状态. 类图结构:. client. originator.

Download Presentation

Design Patterns ---Memento

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Design Patterns---Memento

  2. Design Patterns classification: 行为模式 创建模式 备忘录模式 结构模式

  3. 备忘录: • 定义及目的 • 类图结构 • 使用举例 • 适用情况 • 缺陷

  4. 1.定义 备忘录是这样一种模式: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。2.目的 想要恢复对象某时的原有状态

  5. 类图结构: client originator 《Interface》 Memento Caretaker

  6. Originator:发起人角色,主要完成如下工作:创建一个含有当前的内部状态的备忘录对象;使用备忘录对象存储其内部状态。Originator:发起人角色,主要完成如下工作:创建一个含有当前的内部状态的备忘录对象;使用备忘录对象存储其内部状态。 Memento:备忘录角色, 主要负责的工作如下:将发起人对象的内部状态存储起来;可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。Caretaker:负责人角色,完成工作如下:负责保存备忘录对象; 因为备忘录对象记录的的发起人对象的内部状态,除了发起人,其他任何对象都不能读取并修改里面的内容。 不保存备忘录对象的内容! Why???

  7. 使用举例: 1)需求Anna的mother对nana当前的状态很不满意:不爱打扮,做事拖拖拉拉,十足马大哈。该mother想对Anna进行改造,但又唯恐改造后还不如从前的Anna好,有可能需要实现“时光倒流”功能。2)分析经过细细分析,这个状态保存功能其实可以通过备忘录模式来得到很好的实现,可通过备忘录来保存Anna当前的状态:不爱打扮,做事拖拖拉拉,十足马大哈,以及其它的N多缺点。如果改造后的Anna不如从前,那我们让我们的备忘录将其还原为以前的状态。

  8. 3)代码参考实现 i)发起人角色public class Originator {private String state;/*** 工厂方法,返回一个新的备忘录对象*/public Memento createMemento {return new Memento(state);}/*** 将发起人恢复到备忘录对象所记载的状态*/public void restoreMemento(Memento memento) {this.state = memento.getState();}//省略状态state的getter和setter方法 }

  9. ii)备忘录角色//省略状态state的getter和setter方法public class Memento {private String state;/*** 构造函数*/public Memento(String state) {this.state = state;} }

  10. iii)负责人角色public class Caretaker {private Memento memento;/*** 备忘录的取值方法*/public Memento retrieveMemento {return this.memento;}/*** 备忘录的保存方法*/public void saveMemento(Memento memento) {this.memento = memento;} //省略state的getter和setter方法}

  11. 运行结果将是anna恢复到以前的状态,这就是通过备忘录模式设计来实现的。运行结果将是anna恢复到以前的状态,这就是通过备忘录模式设计来实现的。 iv)客户端模拟实现public class Client {private static Originator ori = new Originator();private static Caretaker taker = new Caretaker();public static void main(String[] args) {//anna当前的状态ori.setState("不爱打扮,做事拖拖拉拉,十足马大哈");//保存anna当前的状态taker.saveMemento(ori.createMemento());//mother要对anna进行改造ori.setState("穿着时髦,做事精练");//mother发现改造后产生了很多副作用,于是反悔了,要恢复女儿以前的样子ori.restoreMemento(taker.retrieveMemento());//anna被打回原型System.out.println("amigo当前情况: " + ori.getState());}}

  12. 适用情况: 适用性(Applicability) 当下列情形时使用备忘录模式: 1. 一个对象状态某时的快照(即当时状态下的相关信息)必须储存以便未来可以回复到这个状态。 2.一个直接的接口获得状态将破坏对象的封装性。

  13. 适用情况举例: • eg1. 备忘录在jsp+javabean的使用:在一系统中新增帐户时,在表单中需要填写用户名、密码、联系电话、地址等信息,如果有些字段没有填写或填写错误,当用户点击“提交”按钮时,需要在新增页面上保存用户输入的选项,并提示出错的选项。这就是利用JavaBean的scope="request"或scope="session"特性实现的,即是用备忘录模式实现的。 • eg2. 修理汽车的刹车时。首先移开两边的挡板,露出左右刹车片。只能卸下一片,这时另一片作为一个备忘录来表明刹车是怎样安装的。在这片修理完成后,才可以卸下另一片。当第二片卸下时,第一片就成了备忘录。

  14. 缺陷: 使用备忘录模式可能是昂贵的: 备忘录模式可能导致可想象的负担;如果源头对象必须复制大量的信息储存在备忘录对象中。除非封装并恢复源头对象状态是便宜的,否则这个模式可能并不适当。 我们应该在适当的条件下选择备忘录模式,避免造成不必要的资源浪费。

  15. Thank you~~~

More Related