前言
备忘录模式一般不怎么用,它也是一种行为型设计模式。
目录
一、定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
二、模式原理分析
备忘录模式包含两个关键角色
-
原始对象
(Originator)
:除了创建自身所需要的属性和业务逻辑外,还通过提供方法create()
和restore(memento)
来保存和恢复对象副本 -
备忘录
(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());
}
}
复制代码
三、使用场景
-
需要保存一个对象在某一个时刻的状态时刻
-
提供一个可回滚的操作,比如
Word
中的CTRL + Z
组合键 -
需要监控的副本场景中。例如要监控一个对象的属性,但是监控又不应该作为系统的主业务来调用,可以考虑备份一个副本,在子线程中分析处理
-
数据库连接的事务管理就是用的备忘录模式
四、优点
-
能够快速撤消对对象状态的更改
-
能够提升代码的扩展性。 备忘录模式是通过增加外部对象来保存原始对象的状态,而不是在原始对象中新增状态记录,当不再需要保存对象状态时就能很方便地取消这个对象。同理,新增备忘录对象也非常容易
-
能够帮助缓存记录历史对象状态。比如,在客服会话聊天中,对于某一些重要的对话(退换货、价保等),我们会记录这些对象数据,传统的做法是调用一次服务接口,一旦服务出现故障就很容易导致聊天回复速度变慢;而使用备忘录模式则能够记录这些重要的数据信息(用户提供的订单数据),而不需要反复查询接口,这样能提升回复客户的效率
五、缺点
-
备忘录的生命周期,要主动去管理,释放它们
-
备忘录的性能,备份太多,势必对性能造成影响
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END