标签:bsp stat ted 注意事项 sed tor rgs 备忘录模式 turn
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
核心:
优点:
缺点:
使用场景:
注意事项:1、为了符合迪米特原则,还要增加一个管理备忘录的类。 2、为了节约内存,可使用原型模式+备忘录模式。
//源发器类 public class Originator { private String name ; //构造器 public Originator() {} //保存快照 public Memento saveState() { return new Memento(this.name); } //恢复快照 public void revertState(Memento men) { this.name = men.getName(); if(this.name == null || "".equals(name)) { name = "已还原"; } } //撤销快照 public void revokeState(Memento men) { this.name = men.getName(); if(this.name == null || "".equals(name)) { name = "已还原"; } } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Originator [name=" + name + "]"; } }
public class Memento { private String name ; public Memento(String n) { this.name = n; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Memento [name=" + name + "]"; } }
public class CareTaker { private int cursor = 0; private List<Memento> ms = new ArrayList<>(); //添加快照 public void addList(Memento m) { if(cursor == 0) { ms.add(new Memento("")); } ms.add(m); cursor++; } //恢复上个快照 public Memento revertBack() { // System.out.println("cursor =" + cursor); if(cursor == 0) { return ms.get(0); } return ms.get(--cursor); } //撤销上个快照 public Memento revokeNext() { // System.out.println("cursor =" + cursor); if(cursor<ms.size()-1) { return ms.get(++cursor); }else { return ms.get(ms.size()-1); } } @Override public String toString() { return "CareTaker [ms=" + ms + "]"; } }
public class StateDemo { public static void main(String[] args) { //初始化源文件 Originator origin = new Originator(); //创建管理快照类 CareTaker ct = new CareTaker(); //第一次往源文件添加内容 origin.setName("1"); //第一次保存快照 ct.addList(origin.saveState()); System.out.println("第一次存档,管理类快照显示"+ct.toString()); //第二次往源文件添加内容 origin.setName("12"); //第二次保存快照 ct.addList(origin.saveState()); System.out.println("第二次存档,管理类快照显示"+ct.toString()); //第三次往源文件添加内容 origin.setName("123"); //第三次保存快照 ct.addList(origin.saveState()); System.out.println("第三次存档,管理类快照显示"+ct.toString()); System.out.println("-------------------------------------------"); origin.revertState(ct.revertBack()); System.out.println("恢复,文档内容为:"+origin.getName()); origin.revertState(ct.revertBack()); System.out.println("恢复,文档内容为:"+origin.getName()); origin.revertState(ct.revertBack()); System.out.println("恢复,文档内容为:"+origin.getName()); origin.revertState(ct.revertBack()); System.out.println("恢复,文档内容为:"+origin.getName()); origin.revokeState(ct.revokeNext()); System.out.println("撤销,文档内容为:"+origin.getName()); origin.revokeState(ct.revokeNext()); System.out.println("撤销,文档内容为:"+origin.getName()); origin.revokeState(ct.revokeNext()); System.out.println("撤销,文档内容为:"+origin.getName()); origin.revertState(ct.revertBack()); System.out.println("恢复,文档内容为:"+origin.getName()); origin.revokeState(ct.revokeNext()); System.out.println("撤销,文档内容为:"+origin.getName()); origin.revokeState(ct.revokeNext()); System.out.println("撤销,文档内容为:"+origin.getName()); origin.revertState(ct.revertBack()); System.out.println("恢复,文档内容为:"+origin.getName()); System.out.println("-------------------------------------------"); System.out.println("管理类快照显示"+ct.toString()); } }
标签:bsp stat ted 注意事项 sed tor rgs 备忘录模式 turn
原文地址:https://www.cnblogs.com/vincentYw/p/12674608.html