JAVA设计模式之备忘录模式

来源:互联网 发布:欧洲人看俄罗斯 知乎 编辑:程序博客网 时间:2024/05/29 12:39

JAVA设计模式之备忘录模式

概念:

备忘录模式(memento),保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态。

结构

原发器类Originator:保存对象内部状态

备忘录类Memento:存储状态的拷贝

负责人类CareTake:存储备忘录

应用

  1. 棋类开发中的悔棋
  2. 普通软件的撤销
  3. 数据库软件中,事务管理的回滚操作

类图

备忘录模式类图

代码

代码类图:
雇员信息代码类图

 // 源发器类public class Emp {    private String name;    private int age;    // 进行备忘操作,返回备忘录对象    public EmpMemento memento() {        return new EmpMemento(this);    }    // 进行数据恢复,恢复成指定备忘录的值    public void recovery(EmpMemento mmt) {        this.name = mmt.getName();        this.age = mmt.getAge();    }    public Emp(String name, int age) {        this.name = name;        this.age = age;    }    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 class EmpMemento {    private String name;    private int age;    public EmpMemento(Emp emp) {        this.name = emp.getName();        this.age = emp.getAge();    }    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 class CareTake {    private List empMementoList = new ArrayList<>();//用stack更好,还可以序列化和持久化,存到磁盘,以防丢失    public void addMemento(EmpMemento empMemento) {        empMementoList.add(empMemento);    }    // 按顺序逐个恢复    public EmpMemento getLastMemento() {        if (empMementoList.size() <= 0) {            return null;        }        int index = empMementoList.size() - 1;        EmpMemento result = empMementoList.get(index);        empMementoList.remove(index);        return result;    }}
 public class Main {    public static void main(String[] args) {        CareTake taker = new CareTake();        Emp emp = new Emp("55", 15);        taker.addMemento(emp.memento());        System.out.println(JSON.toJSONString(emp));        emp.setAge(16);        taker.addMemento(emp.memento());        System.out.println(JSON.toJSONString(emp));        emp.setAge(17);        System.out.println(JSON.toJSONString(emp));        emp.recovery(taker.getLastMemento());        System.out.println(JSON.toJSONString(emp));        emp.recovery(taker.getLastMemento());        System.out.println(JSON.toJSONString(emp));    }}
0 0
原创粉丝点击