当前位置: 移动技术网 > IT编程>软件设计>设计模式 > 设计模式 |备忘录模式(memento)

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

2019年06月04日  | 移动技术网IT编程  | 我要评论
定义: 定义: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 结构:(书中图,侵删) Originator:需要备份的类(写在便签上的内容) Memento:备份类,里面包含部分或全部Originator的属性(便签纸) C ...

定义:

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

结构:(书中图,侵删)

 

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]

总结:

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网