一、定义
定义:记录一个关键对象的关键属性,当关键属性发生变化的时或者出错时,有办法将对象恢复到以前的状态。
角色:
发起人Originator:这个角色是需要被记录的关键对象。一般来说,它有几个比较关键的属性需要被记录。
备忘录Memento:发起人将自己的关键属性保存到备忘录对象中。当发起人需要恢复的关键属性的时候,拿出这个备忘录即可。
管理角色Caretaker:用于保存备忘录的地方。当发起人需要恢复的时候,从管理角色中拿出某个版本的备忘录。这点非常像Git版本控制。
推荐文章:
二、优缺点
优点:当关键对象的关键属性变化并且出错时,我们可以使用备忘录模式将对象还原。
缺点:如果要记录多个版本的关键对象,那么要创建多个版本的备忘录对象。那么对资源的消耗还是比较大的。
三、心法
实际应用:数据库事务回滚。
使用场景:当一个对象需要记录其历史属性,并且需要记录的属性是所有属性的一部分时,可以使用备忘录模式记录属性。
怎么才能知道这个对象的关键属性变化了呢?利用观察者模式进行控制,当对关键对象的关键属性进行修改的时候,关键对象创建备忘录,让相关对象来记录此备忘录。
四、简单例子代码
/** * Created by Administrator on 2018/5/30. */ //发起者类 public class Originator { private String key;//关键属性 /** * 创建备忘录 * @return 备忘录对象 */ public MemontoIF createMemoto(){ return new Memonto(this.key); } /** * 恢复状态 */ public void recover(MemontoIF memontoIF){ Memonto memonto = (Memonto)memontoIF; this.setKey(memonto.getKey()); } public String getKey() { return key; } public void setKey(String key) { this.key = key; } @Override public String toString() { return "Originator{" + "key='" + key + '\'' + '}'; } /** * 备忘录类,是发起者类的内部类,实现标记接口,对外不开放。 * 客户端只能拿到此标记接口的实现类 */ private class Memonto implements MemontoIF{ //记录发起者类的关键属性 private String key; public Memonto(String key) { this.key = key; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } } /** * 客户端调用环境 */ public static void main(String[] args) { Originator originator = new Originator(); originator.setKey("key1"); System.out.println(originator); //上一次的状态 MemontoIF memontoIF = originator.createMemoto(); originator.setKey("key2"); System.out.println(originator); //恢复 originator.recover(memontoIF); System.out.println(originator); /** * 运行结果: * Originator{key='key1'} * Originator{key='key2'} * Originator{key='key1'} */ } } //标记接口 interface MemontoIF{ }