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

一、场景

  • 录入大批人员资料。正在录入当前资料时,发现上一个录错了,此时需要回复上一个资料,再进行修改
  • 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、备忘录模式(设计模式笔记))