设计模式_备忘录模式(22)

来源:互联网 发布:尸油 知乎 编辑:程序博客网 时间:2024/05/17 20:55
  • 什么是备忘录模式
  • 备忘录模式例子
  • 备忘录模式的使用场景
  • 备忘录模式的优缺点
  • 闲言碎语


什么是备忘录模式

   在日常编程的过程中.我们有时可能要对自己的的所编写的代码进行撤销操作.这时我们一般都会用到ctrl+z进行完成.在我们的程序中.我们在某些场景中.我们要对某些变量进行进行保存.当失误出现是进行回滚.这时我们就要用到备用录模式了

   定义:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

   角色:

     Originator: 原发器。负责创建一个备忘录,用以记录当前对象的内部状态,通过也可以使用它来利用备忘录恢复内部状态。同时原发器还可以根据需要决定Memento存储Originator的那些内部状态。(可以访问备忘录里的所有信息。)

     Memento: 备忘录。用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Memento。在备忘录Memento中有两个接口,其中Caretaker只能看到备忘录中的窄接口,它只能将备忘录传递给其他对象。Originator可以看到宽接口,允许它访问返回到先前状态的所有数据。(不可以访问备忘录里面的数据,但是他可以保存备忘录并且可以将备忘录传递给其他对象。)

     Caretaker: 负责人。负责保存好备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。(不可访问也不可以保存,它只负责接收从负责人那里传递过来的备忘录同时恢复原发器的状态。)


备忘录模式例子

备忘录

package com.designPattern.memento;/** * 备忘录(实际对数据备份的类) *  * @author Jason * */public class Memento {private String val;// 存放备份的值public Memento(String val) {this.val = val;}public String getVal() {return val;}public void setVal(String val) {this.val = val;}}


原发器

package com.designPattern.memento;/** * 原始数据(原发器) *  * @author Jason * */public class Original {String val;// 创建副本public Memento createMemento() {return new Memento(val);}// 从副本恢复public void restoreMemento(Memento memento) {this.val = memento.getVal();}public Original(String val) {this.val = val;}public String getVal() {return val;}public void setVal(String val) {this.val = val;}}

负责人

package com.designPattern.memento;/** * 进行数据备份的类 *  * @author Jason * */public class Storage {private Memento memento;public Storage(Memento memento) {this.memento = memento;}public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}}
测试类

package com.designPattern.memento;import org.junit.Test;/** * 测试类 *  * @author jason * */public class Testcase {@Testpublic void test() {Original ori = new Original("apple");Storage storage = new Storage(ori.createMemento());System.out.println("原始数据:" + ori.getVal());ori.setVal("banana");System.out.println("修改后的数据:" + ori.getVal());// 数据恢复ori.restoreMemento(storage.getMemento());System.out.println("恢复后的数据:" + ori.getVal());}}

备忘录模式的使用场景

  1. 棋类游戏,悔棋

  2. 普通软件,撤销操作

  3. 数据库软件中的,事务管理的,回滚操作

  4. Photoshop软件

备忘录模式的优缺点

 优点:
    当发起人角色中的状态改变时,有可能这是个错误的改变,我们使用备忘录模式就可以把这个错误的改变还原。备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。
 缺点:
    在实际应用中,备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是比较严重的。如果有需要提供回滚操作的需求,使用备忘录模式非常适合,比如jdbc的事务操作,文本编辑器的Ctrl+Z恢复等。

闲言碎语

   命令模式实现中,在实现命令的撤销和重做的时候,可以使用备忘录模式,在命令操作的时候记录下操作前后的状态,然后在命令撤销和重做的时候,直接使用命令模式实现中,在实现命令的撤销和重做的时候,可以使用备忘录模式,在命令操作的时候记录下操作前后的状态,然后在命令撤销和重做的时候,直接使用相应的备忘录对象来恢复状态就可以了。在这种撤销的执行顺序和重做执行顺序可控的情况下,备忘录对象还可以采用增量式记录的方式,可以减少缓存的数据量。

   在原发器对象创建备忘录对象的时候,如果原发器对象中全部或者大部分的状态都需要保存,一个简洁的方式就是直接克隆一个原发器对象。也就是说,这个时候备忘录对象里面存放的是一个原发器对象的实例。