备忘录模式

2020-06-25  本文已影响0人  nieniemin

什么是备忘录模式

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

模式角色

UML类图

备忘录模式

代码实现

现实生活中的 打游戏时的存档,Windows 里的 ctri + z等都是备忘录的应用场景。代码中以用户信息恢复为例,实现备忘录模式。

public class UserOriginator {

    private String username;
    private String passwd;

    // 创建一个备忘录
    public Memento createMemento() {
        return new Memento(username, passwd);
    }

    // 记录、恢复自身的内部状态
    public void restoreMemento(Memento memento) {
        this.passwd = memento.getPasswd();
        this.username = memento.getUsername();
    }


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

    public void show() {
        System.out.println("用户名:" + this.username);
        System.out.println("密码:" + this.passwd);
    }

}
public class Memento {


    private String username;
    private String passwd;

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

    public String getUsername() {
        return username;
    }

    public Memento(String username, String passwd) {

        this.username = username;
        this.passwd = passwd;
    }


}
public class Caretaker {

    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}
public class Client {
    public static void main(String[] args) {

        System.out.println("*******用户初始信息********************");
        UserOriginator userOriginator = new UserOriginator();
        userOriginator.setUsername("lisi");
        userOriginator.setPasswd("654321");
        userOriginator.show();

        //备忘录存储发起人对象内部状态
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(userOriginator.createMemento());

        // lisi修改为张三,654321修改为123456
        userOriginator.setUsername("zhangsan");
        userOriginator.setPasswd("123456");
        userOriginator.show();


        // 恢复状态
        userOriginator.restoreMemento(caretaker.getMemento());
        userOriginator.show();
    }
}
*******用户初始信息********************
用户名:lisi
密码:654321
// 修改后的用户信息
用户名:zhangsan
密码:123456
// 恢复初始化用户信息
用户名:lisi
密码:654321

优点

上一篇 下一篇

猜你喜欢

热点阅读