博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌
Java知识图谱点击链接:体系化学习Java(Java面试专题)
💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕💕
1、什么是备忘录模式
备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不暴露对象内部状态的情况下捕获和恢复对象的内部状态。备忘录模式通过在对象中创建一个备忘录对象,用于保存对象的状态,并在需要时将对象恢复到之前的状态。
备忘录模式的核心思想是将对象的状态封装到备忘录对象中,通过将备忘录对象保存在一个管理者对象中,实现对对象状态的保存和恢复。这样可以实现对象状态的撤销、重做、历史记录等功能。
2、备忘录模式的优缺点
备忘录模式的优点包括:
备忘录模式可以实现对象状态的保存和恢复,使得对象的状态变化具有可追溯性,可以方便地进行撤销和重做操作。
备忘录模式可以将对象的状态封装在备忘录对象中,从而保持了对象的封装性,不会暴露内部状态给外部对象。
备忘录模式可以在不破坏对象封装性的前提下,捕获和保存对象的内部状态,使得对象可以在不同的时间点恢复到之前的状态。
备忘录模式的缺点包括:
如果需要保存的对象状态较多或者状态变化频繁,备忘录模式会消耗较多的内存资源。
如果需要保存的对象状态较复杂,备忘录模式可能会增加代码的复杂性和维护成本。
如果对象的状态需要保密或者访问权限受限,备忘录模式可能会破坏对象的封装性。
总体来说,备忘录模式适用于需要保存和恢复对象状态的场景,特别是在需要实现撤销、重做、历史记录等功能时。但是在使用时需要权衡内存消耗和代码复杂性。
3、备忘录模式的应用场景
备忘录模式适用于以下场景:
需要保存和恢复对象状态的情况:当需要保存对象的某个状态,并在需要时将对象恢复到该状态时,可以使用备忘录模式。例如,文本编辑器中的撤销和重做功能,可以使用备忘录模式来保存文本的不同版本状态。
需要实现撤销、重做或者历史记录功能的情况:备忘录模式可以用于实现撤销、重做或者历史记录功能。例如,图形绘制软件中的撤销和重做功能,可以使用备忘录模式来保存不同绘制步骤的状态,以便在需要时进行恢复。
需要实现对象状态的快照功能的情况:备忘录模式可以用于实现对象状态的快照功能,即在某个时间点保存对象的状态,并在需要时恢复到该状态。例如,游戏中的存档功能,可以使用备忘录模式来保存游戏进度的快照。
需要实现多级撤销功能的情况:备忘录模式可以支持多级撤销功能,即可以保存多个状态,并按照一定的顺序进行恢复。例如,文档编辑软件中的多级撤销功能,可以使用备忘录模式来保存多个编辑操作的状态,并按照操作的顺序进行恢复。
总之,备忘录模式适用于需要保存和恢复对象状态、实现撤销、重做、历史记录等功能的场景。它可以提高代码的可维护性和灵活性,同时保持对象的封装性。
4、备忘录模式的结构
备忘录模式的结构包括以下几个角色:
发起人(Originator):负责创建备忘录对象,并可以使用备忘录对象来保存和恢复自身的状态。
备忘录(Memento):用于保存发起人对象的状态,可以包含发起人的部分或全部状态信息。
管理者(Caretaker):负责保存和管理备忘录对象,可以根据需要保存多个备忘录对象,并在需要时将其提供给发起人进行状态的恢复。
备忘录模式的基本流程如下:
发起人创建备忘录对象,并将自身的状态保存到备忘录对象中。
发起人将备忘录对象交给管理者进行管理,管理者可以保存多个备忘录对象。
在需要时,发起人可以从管理者那里获取备忘录对象,并使用备忘录对象来恢复自身的状态。
备忘录模式的结构图如下所示:
| Originator |
+-----------------+
|
| createMemento()
|
+-----------------+
| Memento |
+-----------------+
|
| getState()
+-----------------+
| setState() |
+-----------------+ |
| Caretaker | |
+-----------------+ |
| |
| addMemento() |
| |
+---------------+
在这个结构中,发起人(Originator)通过调用createMemento()方法创建备忘录对象,并将自身的状态保存到备忘录对象中。备忘录对象(Memento)可以通过getState()方法获取发起人的状态,也可以通过setState()方法设置发起人的状态。管理者(Caretaker)负责保存和管理备忘录对象,可以通过addMemento()方法将备忘录对象添加到管理者中,并在需要时提供给发起人进行状态的恢复。
5、备忘录模式的原理
备忘录模式的原理是通过将对象的状态保存到备忘录对象中,以便在需要时可以将对象恢复到之前的状态。
具体原理如下:
发起人(Originator):发起人是需要保存状态的对象。当发起人需要保存当前状态时,会创建一个备忘录对象,并将自身的状态保存到备忘录对象中。
备忘录(Memento):备忘录对象用于保存发起人的状态。它可以包含发起人的部分或全部状态信息,但是对外部是不可见的,只有发起人能够访问备忘录对象的状态。
管理者(Caretaker):管理者负责保存和管理备忘录对象。它可以保存多个备忘录对象,可以根据需要进行备忘录的存储和提供。
客户端(Client):客户端通过与发起人和管理者进行交互来实现状态的保存和恢复。客户端可以通过发起人创建备忘录对象,并将备忘录对象交给管理者进行管理。在需要恢复状态时,客户端可以从管理者那里获取备忘录对象,并将其传递给发起人进行状态的恢复。
备忘录模式的核心思想是将对象的状态保存到备忘录对象中,从而实现状态的保存和恢复。这样可以使得对象在不破坏封装性的前提下,可以方便地保存和恢复状态,提高代码的可维护性和灵活性。
6、备忘录模式的代码案例
package com.pany.camp.design.principle.memorandum;
/**
*
* @description: 发起人
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-28 20:46
*/
public class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
public Memento createMemento() {
return new Memento(state);
}
public void restoreMemento(Memento memento) {
this.state = memento.getState();
}
}
package com.pany.camp.design.principle.memorandum;
/**
*
* @description: 备忘录类
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-28 20:46
*/
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
package com.pany.camp.design.principle.memorandum;
/**
*
* @description: 管理者类
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-28 20:46
*/
public class Caretaker {
private Memento memento;
public void setMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
package com.pany.camp.design.principle.memorandum;
/**
*
* @description: 客户端类
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-28 20:47
*/
public class Client {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
// 设置初始状态
originator.setState("State 1");
System.out.println("初始状态:" + originator.getState());
// 创建备忘录并保存状态
caretaker.setMemento(originator.createMemento());
// 修改状态
originator.setState("State 2");
System.out.println("修改后的状态:" + originator.getState());
// 恢复状态
originator.restoreMemento(caretaker.getMemento());
System.out.println("恢复后的状态:" + originator.getState());
}
}
Originator类是发起人,负责保存和恢复状态。Memento类是备忘录,用于保存状态。Caretaker类是管理者,负责保存和管理备忘录。Client类是客户端,用于测试备忘录模式的使用。
运行以上代码,输出结果如下:
初始状态:State 1
修改后的状态:State 2
恢复后的状态:State 1
Process finished with exit code 0
💕💕 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
💕💕喜欢的话记得点赞收藏啊