备忘录模式

一、定义

备忘录模式(Memento Pattern):在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对对象恢复到以前的状态。--百度百科

重点:

1、这是一种行为模式
2、不破坏封闭性
3、保存的是对象的内部状态
4、在对象之外保存状态

二、简单示例

1、不用设计模式的情况

有一个student对象,代码如下:

package com.hqzmss.memento.useless;

public class Student {
    private String name;
    private boolean sex;
    private int age;
    //以下是一些getter和setter方法
    public String getName() {return name;}
    public void setName(String name) {this.name = name; }
    public boolean isSex() {return sex;}
    public void setSex(boolean sex) {this.sex = sex;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age; }
}

然后在一个类中需要对其进行操作,如下:

package com.hqzmss.memento.useless;

public class MainClass {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("hqz");
        student.setAge(20);
        student.setSex(true);

        //保存原对象的状态信息(此操作与此类的职责无关)
        Student save = new Student();
        save.setAge(student.getAge());
        save.setName(student.getName());
        save.setSex(student.isSex());

        //修改原对象(这里才是此类应有的职责)
        student.setAge(10);
        student.setName("li");
        student.setSex(false);

        //恢复原对象的状态信息(此操作与此类的职责无关)
        student.setAge(save.getAge());
        student.setName(save.getName());
        student.setSex(save.isSex());
    }
}
说明:

这里实现的功能跟备忘录实现的功能是一样的,在对Student进行操作的时候,我们可能需要把该对象的状态暂存,然后在适当的时候进行恢复。

弊端:

a、违反了单一职责原则。因为保存原对象的状态信息并不是main方法所要做的事情。
b、导致很多重复代码。当在很多地方需要保存/恢复对象信息的时候需要写很多重复代码

2、使用备忘录模式的情况

a、在原对象中加入两个方法:

package com.hqzmss.memento.use;

public class Student {
    private String name;
    private boolean sex;
    private int age;

    /**
     * 创建并返回一个新的备忘录
     * @return 新的备忘录
     */
    public Memento createMemento() {
        return new Memento(name, age, sex);
    }

    /**
     * 使用一个备忘录恢复原对象
     * @param memento 备忘录
     */
    public void restoreMemento(Memento memento) {
        this.name = memento.getName();
        this.sex = memento.isSex();
        this.age = memento.getAge();
    }

    public String getName() {return name;}
    public void setName(String name) { this.name = name;}
    public boolean isSex() {return sex;}
    public void setSex(boolean sex) { this.sex = sex;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
}

b、新建一个备忘录对象

package com.hqzmss.memento.use;

/**
 *此类便是备忘录了,这里存储的是Student类里的部分或全部状态
 */
public class Memento {
    private String name;
    private int age;
    private boolean sex;
   
    public Memento(String name, int age, boolean sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getAge() { return age;}
    public void setAge(int age) {this.age = age;}
    public boolean isSex() {return sex;}
    public void setSex(boolean sex) { this.sex = sex;}
}

c、新建一个负责人对象,此对象负责存储备忘录

package com.hqzmss.memento.use;

/**
 * 负责人,此类负责创建或获取一个备忘录
 */
public class Caretaker {
    private Memento memento;

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

d、main函数备份对象信息时采用如下方式

package com.hqzmss.memento.use;

public class MainClass {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("hqz");
        student.setAge(9);
        student.setSex(true);
        Caretaker caretaker = new Caretaker();

        //创建备忘录
        caretaker.setMemento(student.createMemento());

        //修改原对象信息
        student.setName("123");

        //恢复原对象的状态信息
        student.restoreMemento(caretaker.getMemento());
    }
}

至此,一个简单的备忘录模式就完成了。

三、专业术语

  • Memento:备忘录
  • Originator:原发器(对应上例中的Student)
  • Caretaker:负责人

你可能感兴趣的:(备忘录模式)