前言
正文
介绍
在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
我认为备忘只是用来辅助业务逻辑,这里可以按照职责,分为三个角色:
- 备忘录角色:存储需要“备忘”的属性
- 组织角色:进行业务逻辑的角色,也就是被“备忘”的角色
- 管理备忘录角色:进行对备忘录的保存和提供
备忘录角色是为了不破坏封装性而存在的。对于备忘的状态,应该不可以修改其中的属性,如果不和组织角色分离,是可以通过暴露的 setter 进行状态的修改。而管理备忘录角色,是可以不和组织角色分离的
模板
类图
代码
被“备忘”的角色
package cn.zjm404.stu.design.behavior.memento;import lombok.Getter;import lombok.Setter;@Getter@Setterpublic class Originator {private int id;private String msg;public Memento createMemento(){return new Memento(id,msg);}public void restoreMemento(Memento memento){this.id = memento.getId();this.msg = memento.getMsg();}}
存储备忘信息的角色
package cn.zjm404.stu.design.behavior.memento;import lombok.AllArgsConstructor;import lombok.Getter;@AllArgsConstructor@Getterpublic class Memento {private int id;private String msg;}
管理备忘的角色
package cn.zjm404.stu.design.behavior.memento;import java.util.Stack;public class Caretaker {private Stack<Memento> mementos;public Caretaker(){mementos = new Stack<>();}public void addMemento(Memento memento){mementos.push(memento);}public Memento getMemento(){return mementos.pop();}}
测试
package cn.zjm404.stu.design.behavior.memento;public class Client {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setId(1);originator.setMsg("hello world");//添加快照 m1Memento m1 = originator.createMemento();caretaker.addMemento(m1);//修改值originator.setMsg("HELLO WORLD");//添加快照 m2Memento m2 = originator.createMemento();caretaker.addMemento(m2);//修改originator.setMsg("hello");//恢复到快照 m2originator.restoreMemento(caretaker.getMemento());//输出信息System.out.println(originator.getId());System.out.println(originator.getMsg());}}
