java设计模式之备忘录模式

    备忘录模式,是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。

解决问题:

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

使用场景:

    如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。

        1、一个类需要保存它的对象的状态(相当于Originator角色)

        2、设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)

        3、需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存

        4、undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态

应用实例:

    1、打游戏时的存档。

    2、Windows 里的 ctri + z。

    3、IE 中的后退。

    4、数据库的事务管理。

备忘录模式UML图:


角色和职责:

Originator(原生者)

    需要被保存状态以便恢复的那个对象。

Memento(备忘录)

    该对象由Originator创建,主要用来保存Originator的内部状态。

Caretaker(管理者)

    负责在适当的时间保存/恢复Originator对象的状态。

代码实现示例:

/**
 * 备忘录类
 */
public class Memento {
  //姓名
  private String name;
  //性别
  private String sex;
  //年龄
  private int age;
  
  public Memento(String name, String sex, int age){
    this.name = name ;
    this.age = age;
    this.sex = sex;
  }
  
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  
}

public class Person {
  //姓名
  private String name;
  //性别
  private String sex;
  //年龄
  private int age;

  public Person(String name, String sex, int age){
    this.name = name;
    this.sex = sex;
    this.age = age;
  }
  
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  
  //创建一个备份
  public Memento createMemento(){
    return new Memento(name, sex, age);
  }
  
  //恢复备份,还原
  public void setMemento(Memento memento){
    this.name = memento.getName();
    this.sex = memento.getSex();
    this.age = memento.getAge();
  }
  
  public void display(){
    System.out.println("name:" + name + ",set:" + sex + ",age:" + age);
  }
}

/**
 * 管理者类
 * @author 833902
 * 2018年4月6日 下午3:54:10
 */
public class Caretaker {
  private Memento memento;

  public Memento getMemento() {
    return memento;
  }

  public void setMemento(Memento memento) {
    this.memento = memento;
  }
}

public class MainClass {

  public static void main(String[] args) {
    Person person = new Person("Arain", "男", 26);
    
    Caretaker caretaker = new Caretaker();
    caretaker.setMemento(person.createMemento());
    
    System.out.println("--------------对象初始值-------------");
    person.display();
    
    System.out.println("--------------对象重新赋值------------");
    person.setName("小白兔");
    person.setSex("女");
    person.setAge(3);
    person.display();
    
    System.out.println("--------------对象值恢复--------------");
    person.setMemento(caretaker.getMemento());
    person.display();
  }

}

优点:

    1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。

    2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:

    消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

注意事项:

    1、为了符合迪米特原则,还要增加一个管理备忘录的类。

    2、为了节约内存,可使用原型模式+备忘录模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值