美文网首页
23种设计模式之备忘录模式

23种设计模式之备忘录模式

作者: 阿跳爱学习 | 来源:发表于2019-01-31 20:06 被阅读0次

    注意事项:

    • 备忘录的生命期,要主动管理它的生命周期,建立就要使用,不使用就删除;
    • 备忘录的性能,不要在频繁建立备份的场景中使用备忘录模式,频繁创建对象时需要消耗资源的;

    主要用于保存某个对象内部状态的拷贝,以便可以将该对象恢复到原先状态。

    角色:

    • 源发器类Originator:用于保存内部状态。
    • 备忘录类Memento:用于拷贝。
    • 负责人类CareTake:用于存储备忘录。

    例子:从简,人物对象资料回滚。

    创建人物实体类(源发器类Originator):

    /**
     * 源发器类Originator:用于保存内部状态。
     */
    
    public class Person {
        private String name;
        private String sex;
        private int age;
    
        public Person(String name, String sex, int age) {
            this.name = name;
            this.sex = sex;
            this.age = age;
        }
    
        //备忘操作并且返回备忘对象。
        public PersonMemento memento() {
            return new PersonMemento(this);
        }
    
        //回滚方法,回滚到备份时的状态
        public void rollback(PersonMemento personMemento) {
            this.name = personMemento.getName();
            this.sex = personMemento.getSex();
            this.age = personMemento.getAge();
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    

    创建备忘录类(备忘录类Memento):

    /**
     * 备忘录类Memento:用于拷贝。
     */
    
    public class PersonMemento {
    
        private String name;
        private String sex;
        private int age;
    
        public PersonMemento(Person person) {
            this.name = person.getName();
            this.sex = person.getSex();
            this.age = person.getAge();
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    

    创建负责人类(负责人类CareTake):

    /**
     * 负责人类CareTake:用于存储备忘录。
     */
    
    public class CareTake {
    
        //这是单次备忘,多次备忘可使用容器
        private PersonMemento personMemento;
    
        public PersonMemento getPersonMemento() {
            return personMemento;
        }
    
        public void setPersonMemento(PersonMemento personMemento) {
            this.personMemento = personMemento;
        }
    }
    

    调用:

    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.FragmentActivity;
    import android.util.Log;
    
    /**
     * 这是调用者
     */
    
    public class MainActivity extends FragmentActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //创建负责人类,用于存储备忘录。
            CareTake careTake = new CareTake();
    
            //创建对象
            Person person = new Person("张三", "男", 18);
            Log.d("TAG", "创建的对象:" + person.getName() + "," + person.getSex() + "," + person.getAge());
    
            //备忘记录
            careTake.setPersonMemento(person.memento());
    
            //对刚创建的对象做修改
            person.setAge(26);
            Log.d("TAG", "修改的对象:" + person.getName() + "," + person.getSex() + "," + person.getAge());
    
            //使用备忘录回滚
            person.rollback(careTake.getPersonMemento());
            Log.d("TAG", "回滚的对象:" + person.getName() + "," + person.getSex() + "," + person.getAge());
    
        }
    }
    
    结果: image.png

    已完成测试!有不对的地方欢迎指出,感恩。

    相关文章

      网友评论

          本文标题:23种设计模式之备忘录模式

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