备忘录模式19
一、定义
定义:记录一个关键对象的关键属性,当关键属性发生变化的时或者出错时,有办法将对象恢复到以前的状态。
角色:
发起人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{
}
分割线--------------------------------------------------------------------------------------------
下一篇:状态设计模式20