备忘录模式通常不怎么用,它也是一种行为型设计模式。数据库
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象以外保存这个状态,这样之后就能够将该对象恢复到原先保存的状态。设计模式
备忘录模式包含两个关键角色缓存
原始对象(Originator)
:除了建立自身所须要的属性和业务逻辑外,还经过提供方法 create()
和 restore(memento)
来保存和恢复对象副本markdown
备忘录(Memento
):用于保存原始对象的全部属性状态,以便在将来进行撤销操做函数
下面举的是单状态备忘录模式,多状态就须要用到Map
集合了。性能
//发起人角色
public class Originator{
//内部状态
private String state = "";
public String getState(){
return state;
}
public void setState(String state){
this.state = state;
}
//建立一个备忘录
public Memento createMemento(){
return new Memento(this.state);
}
//恢复一个备忘录
public void restoreMemento(Memento _memento){
this.setState(_memento.getState());
}
}
//备忘录角色
public class Memento{
//发起人的内部状态
private String state = "";
//构造函数
public Memento(String _state){
this.state = _state;
}
public String getState(){
return state;
}
public void setState(String state){
this.state = state;
}
}
//备忘录管理员角色
public class Caretaker{
//备忘录对象
private Memento memento;
public Memento getMemento(){
return memento;
}
public void setMemento(Memento memento){
this.memento = memento;
}
}
//场景类
public class Client{
public static void main(String[] args){
//定义出发起人
Originator originator = new Originator();
//定义出备忘录管理员
Caretaker caretaker = new Caretaker();
//建立一个备忘录
caretaker.setMemento(originator.createMemento());
//恢复一个备忘录
originator.restoreMemento(caretaker.getMemento());
}
}
复制代码
须要保存一个对象在某一个时刻的状态时刻this
提供一个可回滚的操做,好比Word
中的CTRL + Z
组合键spa
须要监控的副本场景中。例如要监控一个对象的属性,可是监控又不该该做为系统的主业务来调用,能够考虑备份一个副本,在子线程中分析处理线程
数据库链接的事务管理就是用的备忘录模式设计
可以快速撤消对对象状态的更改
可以提高代码的扩展性。 备忘录模式是经过增长外部对象来保存原始对象的状态,而不是在原始对象中新增状态记录,当再也不须要保存对象状态时就能很方便地取消这个对象。同理,新增备忘录对象也很是容易
可以帮助缓存记录历史对象状态。好比,在客服会话聊天中,对于某一些重要的对话(退换货、价保等),咱们会记录这些对象数据,传统的作法是调用一次服务接口,一旦服务出现故障就很容易致使聊天回复速度变慢;而使用备忘录模式则可以记录这些重要的数据信息(用户提供的订单数据),而不须要反复查询接口,这样能提高回复客户的效率
备忘录的生命周期,要主动去管理,释放它们
备忘录的性能,备份太多,势必对性能形成影响