美文网首页
21、备忘录模式(设计模式笔记)

21、备忘录模式(设计模式笔记)

作者: yjaal | 来源:发表于2016-10-21 23:33 被阅读33次

    一、场景

    • 录入大批人员资料。正在录入当前资料时,发现上一个录错了,此时需要回复上一个资料,再进行修改
    • word文档编辑时,忽然电脑死机了,再打开时,可以看到word提示你回复到以前的文档
    • 管理系统中,公文撤回功能。公文发送出去后,想车回来

    二、核心

    就是保存某个对象内部状态的拷贝,这样以后就可以将该对象回复到原先的状态

    三、结构

    • 源发器类Originatot
    • 备忘录类Memento
    • 负责人类CareTaker

    Emp.java

    package cn.itcast.day253.memento;
    //源发器类
    public class Emp {
    
        private String name ;
        private int age ;
        private double salary;
        
        //备忘操作,并返回备忘录对象
        public EmpMemento memento(){
            return new EmpMemento(this);
        }
        
        //数据回复,回复成指定备忘录的值
        public void recovery(EmpMemento mmt){
            this.name = mmt.getName();
            this.age = mmt.getAge();
            this.salary = mmt.getSalary();
        }
    
        public Emp(String name, int age, double salary) {
            this.name = name;
            this.age = age;
            this.salary = salary;
        }
        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 double getSalary() {
            return salary;
        }
        public void setSalary(double salary) {
            this.salary = salary;
        }
    }
    

    EmpMemento.java

    package cn.itcast.day253.memento;
    //备忘录类:保存源发器类中的相关信息
    public class EmpMemento {
        private String name ;
        private int age ;
        private double salary;
        
        public EmpMemento(Emp e){
            this.name = e.getName();
            this.age = e.getAge();
            this.salary = e.getSalary();
        }
        
        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 double getSalary() {
            return salary;
        }
        public void setSalary(double salary) {
            this.salary = salary;
        }
    }
    

    CareTaker.java

    package cn.itcast.day253.memento;
    //负责人类:负责管理备忘录对象
    public class CareTaker {
        
        private EmpMemento memento;//当然这里我们也可以是一个容器,这样就可以存储很多个备忘点,最好是一个栈
    
        public EmpMemento getMemento() {
            return memento;
        }
    
        public void setMemento(EmpMemento memento) {
            this.memento = memento;
        }
    }
    

    说明:一个源发器类用来保存我们操作对象的信息,而备忘录类就是保存我们操作过程中的一些状态信息,同时有一个负责人类专门来管理备忘录类,用来撤销等操作。

    Client.java

    package cn.itcast.day253.memento;
    public class Client {
        public static void main(String[] args) {
            CareTaker taker = new CareTaker();
    
            Emp emp = new Emp("yj", 26, 12000);
            System.out.println("第一次:" + emp.getName() + ",年龄:" + emp.getAge()
                    + ",工资:" + emp.getSalary());
            
            taker.setMemento(emp.memento());//备份
            
            emp.setAge(27);
            emp.setSalary(21000);
            
            System.out.println("第二次:" + emp.getName() + ",年龄:" + emp.getAge()
                    + ",工资:" + emp.getSalary());
            
            emp.recovery(taker.getMemento());//恢复
            
            System.out.println("第三次:" + emp.getName() + ",年龄:" + emp.getAge()
                    + ",工资:" + emp.getSalary());
        }
    }
    

    四、开发中常见的场景

    • 棋类游戏中,悔棋
    • 普通软件中,撤销操作
    • 数据库软件中,事物管理中的回滚操作

    相关文章

      网友评论

          本文标题:21、备忘录模式(设计模式笔记)

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