zoukankan      html  css  js  c++  java
  • 第二讲、备忘录模式

    1.定义

    Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。

    2.应用场景

    如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。

    • 一个类需要保存他的对象的状态(相当于Originator角色)
    • 设计一个类,该类只是用来保存上述对象的状态(相当于Memento角色)
    • 需要的时候,Caretaker角色要求Originator返回一个Memento并加以保存
    • undo或rollback操作时,通过Caretaker保存的Memento恢复Originator对象的状态

    3.备忘录模式的结构

    4.备忘录模式的角色和职责

    • Originator(原生者)--需要被保存状态以便恢复的那个对象。
    • Memento(备忘录)--该对象由Originator创建,主要用来保存Originator的内部状态。
    • Caretaker(管理者)--负责在适当的时间保存/恢复Originator对象的状态

    5.代码演示

    package test.com.test;
    /**
     * 原生者 (Originator)
     *
     */
    public class Person {
        private String name;
        private String sex;
        private int age;
        
        
        public Person() {
            
        }
        
        public Person(String name, String sex, int age) {
            super();
            this.name = name;
            this.sex = sex;
            this.age = age;
        }
    
        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;
        }
        
        //创建一个备份
        public Memento createMemento() {
            return new Memento(name, sex, age);
        }
        
        //恢复备份,还原
        public void setMemento(Memento memento) {
            this.name = memento.getName();
            this.sex = memento.getSex();
            this.age = memento.getAge();
        }
        
        //打印状态
        public void display() {
            System.out.println("name:" + name + ",sex:" + sex + ",age:" + age);
        }
    }
    package test.com.test;
    /**
     * 备忘录(Memento)
     *
     */
    public class Memento {
        private String name;
        private String sex;
        private int age;
        
        
        public Memento(String name, String sex, int age) {
            super();
            this.name = name;
            this.sex = sex;
            this.age = age;
        }
        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;
        }
        
    }
    package test.com.test;
    /**
     * 管理者(Caretaker)
     *
     */
    public class Caretaker {
        private Memento memento;
        
        
        public Caretaker() {
            super();
        }
    
        public Memento getMemento() {
            return memento;
        }
    
        public void setMemento(Memento memento) {
            this.memento = memento;
        }
        
        
    }
    package test.com.test;
    /**
     * 测试
     *
     */
    public class Main {
        public static void main(String[] args) {
            Person per = new Person("李强", "男", 24);
            
            //备份
    //        Memento memento = per.createMemento();
            Caretaker caretaker = new Caretaker();
            caretaker.setMemento(per.createMemento());
            per.display();
            
            //修改
            per.setName("李红");
            per.setSex("女");
            per.setAge(30);
            per.display();
            
            //还原
    //        per.setMemento(memento);
            per.setMemento(caretaker.getMemento());
            per.display();
        }
    }
  • 相关阅读:
    TCP 的那些事儿(转载)
    3. 对象在内存中的布局
    GO语言学习之数据类型-->基本类型(字符串)
    GO语言学习之变量and常量
    wrk
    为什么显示消息“错误:您所在国家/地区是禁运国,无法下载 Java”?
    raw.githubusercontent.com 访问不了
    Windows Terminal
    vue:无法加载文件C:UsersAppDataRoaming pmvue.ps1, 在此系统上无法加载脚本
    vue使用过滤改变el-switch开关的状态
  • 原文地址:https://www.cnblogs.com/zheaven/p/9883131.html
Copyright © 2011-2022 走看看