备忘录模式

作者: Jackson杰 | 来源:发表于2019-05-21 11:32 被阅读8次

一 定义

备忘录模式也是一种行为模式,该模式用于保存和恢复对象的状态,向我们提供了一种类似于“后悔药”的机制,一旦出现了操作失误,可以把存储的历史状态取回,即可回到以前的状态。备忘录模式需要被保存的对象状态不能被对象从外部访问。

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

二 模式结构


角色介绍:

  • Originator:负责创建一个备忘录,可以存储它当前的状态,也可以恢复自身的内部状态。
  • Memoto:备忘录角色,用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Memoto。
  • Caretaker:备忘录的管理者,负责存储备忘录,不能对备忘录的内容进行操作和访问,只能将备忘录传递给其它对象。

三 实例

以一个保存用户信息为例,给用户信息设置一个初始状态,然后创建一个备份,存储备份,修改用户信息,然后再用备份还原到初始状态。
代码如下:

  • 备忘录
    备忘录里保存着我们需要存储和恢复的信息。
public class Memoto {

    // 用户名
    private String userName;
    // 密码
    private String password;
    // 电话号码
    private String phoneNumber;


    public Memoto(String username,String password, String phone){
        this.userName=username;
        this.password=password;
        this.phoneNumber=phone;
    }


    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}
  • UserInfoOriginator
    UserInfoOriginator有两个重要的方法,一个是方法时保存备忘录,在此方法里创建备忘录,返回一个新的备忘录对象,要想保存备忘录对象,要将此备忘录对象传到备忘录管理者Caretaker里存储。第二个是恢复备忘录里的信息,需要从备忘录管理者取出原先保存的备忘录对象,传入此方法,恢复备忘录里的信息。
public class UserInfoOriginator {

    // 用户名
    private String userName;
    // 密码
    private String password;
    // 电话号码
    private String phoneNumber;


    /**
     * 保存一个备忘录
     * @return 返回一个新的备忘录对象
     */
    public Memoto saveMemoto(){
        return new Memoto(userName,password,phoneNumber);
    }

    /**
     * 恢复备忘录对象
     * @param memoto
     */
    public void restoreMemoto(Memoto memoto){
        this.userName=memoto.getUserName();
        this.password=memoto.getPassword();
        this.phoneNumber=memoto.getPhoneNumber();
    }


    /**
     * 显示用户信息
     */
    public void show(){
        System.out.println("userName:"+userName);
        System.out.println("password:"+password);
        System.out.println("phone:"+phoneNumber);
    }


    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}
  • 测试代码
 // 创建Originator
        UserInfoOriginator originator=new UserInfoOriginator();
        // 创建管理者
        Caretaker caretaker=new Caretaker();

        originator.setUserName("Jackson");
        originator.setPassword("123456");
        originator.setPhoneNumber("18310056896");

        System.out.println("-----初始状态----");
        originator.show();

        // 保存状态
        caretaker.setMemoto(originator.saveMemoto());

        // 修改状态
        originator.setPassword("25268522");
        originator.setPhoneNumber("18598653256");
        System.out.println("-----修改后状态----");
        originator.show();

        //恢复状态
        originator.restoreMemoto(caretaker.getMemoto());
        System.out.println("-----回复后状态----");
        originator.show();
  • 备忘录管理者
    负责存储备忘录,UserInfoOriginator创建的备忘录对象通过set方法保存在此,恢复数据时通过get方法获取备忘录对象,在此类中,不能对备忘录对对象进行修改,只能传递备忘录对象。
public class Caretaker {

    private Memoto mMemoto;

    public Memoto getMemoto() {
        return mMemoto;
    }

    public void setMemoto(Memoto memoto) {
        mMemoto = memoto;
    }
}

运行结果


四 优缺点

优点

  • 给用户提供了一种可以恢复状态的机制,可以使用户比较方便地回到某个历史状态
  • 实现了信息的封装,用户无需关心状态的保存细节

缺点

  • 消耗资源,如果类的成员变量过多,势必会占用比较大的资源。

相关文章

网友评论

    本文标题:备忘录模式

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