备忘录模式

作者: 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