备忘录模式包含以下几个角色:java
●Originator(原发器):它是一个普通类,能够建立一个备忘录,并存储它的当前内部状态,也可使用备忘录来恢复其内部状态,通常将须要保存内部状态的类设计为原发器。 ●Memento(备忘录):存储原发器的内部状态,根据原发器来决定保存哪些内部状态。备忘录的设计通常能够参考原发器的设计,根据实际须要肯定备忘录类中的属性。须要注意的是,除了原发器自己与负责人类以外,备忘录对象不能直接供其余类使用,原发器的设计在不一样的编程语言中实现机制会有所不一样。 ●Caretaker(负责人):负责人又称为管理者,它负责保存备忘录,可是不能对备忘录的内容进行操做或检查。在负责人类中能够存储一个或多个备忘录对象,它只负责存储对象,而不能修改对象,也无须知道对象的实现细节。
一、主要优势编程
(1)它提供了一种状态恢复的实现机制,使得用户能够方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可使用暂时存储起来的备忘录将状态复原。 (2)备忘录实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其余代码所改动。备忘录保存了原发器的状态,采用列表、堆栈等集合来存储备忘录对象能够实现屡次撤销操做。
二、主要缺点编程语言
资源消耗过大,若是须要保存的原发器类的成员变量太多,就不可避免须要占用大量的存储空间,每保存一次对象的状态都须要消耗必定的系统资源。
三、适用场景测试
(1)保存一个对象在某一个时刻的所有状态或部分状态,这样之后须要时它可以恢复到先前的状态,实现撤销操做。 (2)防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象。
英雄联盟中的备忘录模式(时空裂痕):this
/** * 2018/12/6 * StateOriginator * * @author machuanpeng */ public class StateOriginator { private String time; private String event; public StateOriginator(){} // 建立一个备忘录对象 public Memento createMemento() { return new Memento(this); } // 根据备忘录对象恢复原发器状态 public void restoreMemento(Memento memento) { this.time = memento.getTime(); this.event = memento.getEvent(); } }
/** * 2018/12/6 * Memento * * @author machuanpeng */ public class Memento { private String time; private String event; public Memento(StateOriginator originator) { this.time = originator.getTime(); this.event = originator.getEvent(); } }
/** * 2018/12/6 * Caretaker * * @author machuanpeng */ public class Caretaker { private Memento memento; public Memento getMemento() { return this.memento; } public void setMemento(Memento memento) { this.memento=memento; } }
测试:设计
public class Client { public static void main(String args[]) { // 建立原始类 StateOriginator originator = new StateOriginator(); originator.setTime("2018-12-10 17:07:00"); originator.setEvent("蓝方在打大龙"); // 建立备忘录 Memento memento = originator.createMemento(); Caretaker caretaker = new Caretaker(); caretaker.setMemento(memento); System.out.println("初始化状态为:"+originator.getTime()+originator.getEvent()); // 修改原始类的状态 originator.setTime("2018-12-10 17:10:00"); originator.setEvent("红方在打小龙"); System.out.println("修改后的状态:"+originator.getTime()+originator.getEvent()); // 回复原始类的状态 originator.restoreMemento(caretaker.getMemento()); System.out.println("恢复后的状态:"+originator.getTime()+originator.getEvent()); } }