美文网首页
备忘录模式

备忘录模式

作者: 南谭一隅 | 来源:发表于2018-11-17 13:04 被阅读0次

    一、定义

    备忘录模式(Memento Pattern):在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对对象恢复到以前的状态。--百度百科

    重点:

    1、这是一种行为模式
    2、不破坏封闭性
    3、保存的是对象的内部状态
    4、在对象之外保存状态

    二、简单示例

    1、不用设计模式的情况

    有一个student对象,代码如下:

    package com.hqzmss.memento.useless;
    
    public class Student {
        private String name;
        private boolean sex;
        private int age;
        //以下是一些getter和setter方法
        public String getName() {return name;}
        public void setName(String name) {this.name = name; }
        public boolean isSex() {return sex;}
        public void setSex(boolean sex) {this.sex = sex;}
        public int getAge() {return age;}
        public void setAge(int age) {this.age = age; }
    }
    

    然后在一个类中需要对其进行操作,如下:

    package com.hqzmss.memento.useless;
    
    public class MainClass {
        public static void main(String[] args) {
            Student student = new Student();
            student.setName("hqz");
            student.setAge(20);
            student.setSex(true);
    
            //保存原对象的状态信息(此操作与此类的职责无关)
            Student save = new Student();
            save.setAge(student.getAge());
            save.setName(student.getName());
            save.setSex(student.isSex());
    
            //修改原对象(这里才是此类应有的职责)
            student.setAge(10);
            student.setName("li");
            student.setSex(false);
    
            //恢复原对象的状态信息(此操作与此类的职责无关)
            student.setAge(save.getAge());
            student.setName(save.getName());
            student.setSex(save.isSex());
        }
    }
    
    说明:

    这里实现的功能跟备忘录实现的功能是一样的,在对Student进行操作的时候,我们可能需要把该对象的状态暂存,然后在适当的时候进行恢复。

    弊端:

    a、违反了单一职责原则。因为保存原对象的状态信息并不是main方法所要做的事情。
    b、导致很多重复代码。当在很多地方需要保存/恢复对象信息的时候需要写很多重复代码

    2、使用备忘录模式的情况

    a、在原对象中加入两个方法:

    package com.hqzmss.memento.use;
    
    public class Student {
        private String name;
        private boolean sex;
        private int age;
    
        /**
         * 创建并返回一个新的备忘录
         * @return 新的备忘录
         */
        public Memento createMemento() {
            return new Memento(name, age, sex);
        }
    
        /**
         * 使用一个备忘录恢复原对象
         * @param memento 备忘录
         */
        public void restoreMemento(Memento memento) {
            this.name = memento.getName();
            this.sex = memento.isSex();
            this.age = memento.getAge();
        }
    
        public String getName() {return name;}
        public void setName(String name) { this.name = name;}
        public boolean isSex() {return sex;}
        public void setSex(boolean sex) { this.sex = sex;}
        public int getAge() {return age;}
        public void setAge(int age) {this.age = age;}
    }
    

    b、新建一个备忘录对象

    package com.hqzmss.memento.use;
    
    /**
     *此类便是备忘录了,这里存储的是Student类里的部分或全部状态
     */
    public class Memento {
        private String name;
        private int age;
        private boolean sex;
       
        public Memento(String name, int age, boolean sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
    
        public String getName() {return name;}
        public void setName(String name) {this.name = name;}
        public int getAge() { return age;}
        public void setAge(int age) {this.age = age;}
        public boolean isSex() {return sex;}
        public void setSex(boolean sex) { this.sex = sex;}
    }
    

    c、新建一个负责人对象,此对象负责存储备忘录

    package com.hqzmss.memento.use;
    
    /**
     * 负责人,此类负责创建或获取一个备忘录
     */
    public class Caretaker {
        private Memento memento;
    
        public Memento getMemento() { return memento;}
        public void setMemento(Memento memento) {this.memento = memento;}
    }
    

    d、main函数备份对象信息时采用如下方式

    package com.hqzmss.memento.use;
    
    public class MainClass {
        public static void main(String[] args) {
            Student student = new Student();
            student.setName("hqz");
            student.setAge(9);
            student.setSex(true);
            Caretaker caretaker = new Caretaker();
    
            //创建备忘录
            caretaker.setMemento(student.createMemento());
    
            //修改原对象信息
            student.setName("123");
    
            //恢复原对象的状态信息
            student.restoreMemento(caretaker.getMemento());
        }
    }
    

    至此,一个简单的备忘录模式就完成了。

    三、专业术语

    • Memento:备忘录
    • Originator:原发器(对应上例中的Student)
    • Caretaker:负责人

    相关文章

      网友评论

          本文标题:备忘录模式

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