设计模式——20备忘录模式memento

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

核心
– 就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到 原先的状态。
• 结构:
– 源发器类Originator
– 备忘录类Memento
– 负责人类CareTaker
设计模式——20备忘录模式memento
设计模式——20备忘录模式memento

设计模式——20备忘录模式memento
开发中常见的应用场景:
– 棋类游戏中的,悔棋
– 普通软件中的,撤销操作
– 数据库软件中的,事务管理中的,回滚操作
– Photoshop软件中的,历史记录

实现:

package com.bjsxt.memento;

public class Emp {
    private String name;
    private int age;
    private double salary;

    public EmpMemento memento(){// 备忘
        return new EmpMemento(this);
    }

    public void recovery(EmpMemento empMemento){
        this.name = empMemento.getName();
        this.age = empMemento.getAge();
        this.salary = empMemento.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;
    }
}

package com.bjsxt.memento;

public class EmpMemento {
    private String name;
    private int age;
    private double salary;

    EmpMemento(Emp emp){
        this.name = emp.getName();
        this.age = emp.getAge();
        this.salary = emp.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;
    }
}

package com.bjsxt.memento;

public class CareTaker {// 保存备忘录对象 可以保存多个
    EmpMemento empMemento;

    public EmpMemento getEmpMemento() {
        return empMemento;
    }

    public void setEmpMemento(EmpMemento empMemento) {
        this.empMemento = empMemento;
    }
}

package com.bjsxt.memento;

public class Client {
    public static void main(String[] args) {
        CareTaker careTaker = new CareTaker();

        Emp emp = new Emp();
        emp.setName("王华丽");
        emp.setAge(18);
        emp.setSalary(10000.00);
        System.out.println("原始赋值 "+emp.getName()+","+emp.getAge()+","+emp.getSalary());

        System.out.println("备忘一次");
        EmpMemento memento = emp.memento();
        careTaker.setEmpMemento(memento);// 备忘一次

        emp.setName("王梦茹");
        emp.setAge(27);
        emp.setSalary(70000.00);

        System.out.println("修改后 "+emp.getName()+","+emp.getAge()+","+emp.getSalary());

        emp.recovery(careTaker.getEmpMemento());
        System.out.println("修改内容还原原始状态 "+emp.getName()+","+emp.getAge()+","+emp.getSalary());

    }
}

运行结果:
设计模式——20备忘录模式memento
uml图:
设计模式——20备忘录模式memento

上一篇:内部比较器


下一篇:oracle day-4