设计模式 |备忘录模式(memento)

Posted imoqian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 |备忘录模式(memento)相关的知识,希望对你有一定的参考价值。

定义:

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

结构:(书中图,侵删)

技术图片

 

Originator:需要备份的类(写在便签上的内容)
Memento:备份类,里面包含部分或全部Originator的属性(便签纸)
Caretaker:真正保存备份的地方(便签纸贴的地方)

实例:

替答到。我也不知道怎么就想到了这个。上课的时候,老师点名,如果你要帮同学答到,那么你就需要先将自己的名字藏起来,换成你同学的名字,等替他答完了,你再换回自己名字。(我并没有在教坏小朋友,还请同学们乖乖自己去上课)
 
学生类:
package designpattern.memento;

public class Student 
    private String name;// 姓名
    private String major;// 专业
    private String studentNo;// 学号

    public Student(String name, String major, String studentNo) 
        super();
        this.name = name;
        this.major = major;
        this.studentNo = studentNo;
    

    public Memento createMemento() 
        return new Memento(this.name, this.major);
    

    public void restoreMemento(Memento memento) 
        this.name = memento.getName();
        this.major = memento.getMajor();
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getMajor() 
        return major;
    

    public void setMajor(String major) 
        this.major = major;
    

    public String getStudentNo() 
        return studentNo;
    

    public void setStudentNo(String studentNo) 
        this.studentNo = studentNo;
    

    @Override
    public String toString() 
        return "Student [name=" + name + ", major=" + major + ", studentNo=" + studentNo + "]";
    

备忘录类:
package designpattern.memento;

public class Memento 
    private String name;
    private String major;

    public Memento(String name, String major) 
        super();
        this.name = name;
        this.major = major;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getMajor() 
        return major;
    

    public void setMajor(String major) 
        this.major = major;
    

保存类:
package designpattern.memento;

public class CareTaker 
    private Memento memento;

    public Memento getMemento() 
        return memento;
    

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

客户端:
package designpattern.memento;

public class Client 
    public static void main(String[] args) 
        Student student = new Student("郝鑫仁", "计算机", "1234");
        CareTaker careTaker = new CareTaker();
        careTaker.setMemento(student.createMemento());
        System.out.println(student);

        System.out.println("开始点名...");

        // 伪装成其他同学
        student.setName("齐步莱");
        student.setMajor("自动化");
        System.out.println(student);

        System.out.println("点名结束");

        // 变回自己
        student.restoreMemento(careTaker.getMemento());
        System.out.println(student);

    
结果输出:
Student [name=郝鑫仁, major=计算机, studentNo=1234]
开始点名...
Student [name=齐步莱, major=自动化, studentNo=1234]
点名结束
Student [name=郝鑫仁, major=计算机, studentNo=1234]

总结:

备忘录模式就是用于临时存储类的一部分信息,以便它能回到存储前的状态。
这个我在实际应用中暂时没有遇到相关的实例,书中说到的保存游戏进度算一个,但我自己开发中暂时还没遇到。

以上是关于设计模式 |备忘录模式(memento)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之- 备忘录模式(Memento Pattern)

备忘录模式(Memento Pattern)

B9:备忘录模式 Memento

21备忘录模式Memento

GOF23设计模式之备忘录模式(memento)

Memento备忘录模式