第二讲、备忘录模式

1.定义

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

2.应用场景

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

  • 一个类需要保存他的对象的状态(相当于Originator角色)
  • 设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)
  • 需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存
  • undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态

3.备忘录模式的结构

4.备忘录模式的角色和职责

  • Originator(原生者)--需要被保存状态以便恢复的那个对象。
  • Memento(备忘录)--该对象由Originator创建,主要用来保存Originator的内部状态。
  • Caretaker(管理者)--负责在适当的时间保存/恢复Originator对象的状态

5.代码演示

package test.com.test;
/**
 * 原生者 (Originator)
 *
 */
public class Person {
    private String name;
    private String sex;
    private int age;
    
    
    public Person() {
        
    }
    
    public Person(String name, String sex, int age) {
        super();
        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 + ",sex:" + sex + ",age:" + age);
    }
}
package test.com.test;
/**
 * 备忘录(Memento)
 *
 */
public class Memento {
    private String name;
    private String sex;
    private int age;
    
    
    public Memento(String name, String sex, int age) {
        super();
        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;
    }
    
}
package test.com.test;
/**
 * 管理者(Caretaker)
 *
 */
public class Caretaker {
    private Memento memento;
    
    
    public Caretaker() {
        super();
    }

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
    
    
}
package test.com.test;
/**
 * 测试
 *
 */
public class Main {
    public static void main(String[] args) {
        Person per = new Person("李强", "男", 24);
        
        //备份
//        Memento memento = per.createMemento();
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(per.createMemento());
        per.display();
        
        //修改
        per.setName("李红");
        per.setSex("女");
        per.setAge(30);
        per.display();
        
        //还原
//        per.setMemento(memento);
        per.setMemento(caretaker.getMemento());
        per.display();
    }
}
原文地址:https://www.cnblogs.com/zheaven/p/9883131.html