美文网首页
备忘录模式

备忘录模式

作者: nieniemin | 来源:发表于2020-06-25 19:44 被阅读0次

什么是备忘录模式

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

模式角色

  • Originator发起者(UserOriginator)角色:负责创建一个备忘录,并且可以记录、恢复自身的内部状态。可以根据需要决定备忘录保存自身的那些内部状态。
  • Memento备忘录(Memento)角色:用于存储发起者角色的状态,防止发起者以外的的对象访问备忘录。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象,Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。
  • Caretaker备忘录管理者(Caretaker)角色:负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。

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

优点

  • 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
  • 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
  • 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。
    缺点
  • 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
    备忘录模式完整代码

相关文章

网友评论

      本文标题:备忘录模式

      本文链接:https://www.haomeiwen.com/subject/eeeoxktx.html