一、备忘录模式
概述
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象,备忘录模式属于行为型模式
备忘录模式允许在不破坏封装性的前提下,捕获和恢复对象的内部状态
主要解决:
允许捕获并保存一个对象的内部状态,以便在将来可以恢复到该状态,实现撤销和回滚操作
何时使用:
- 需要实现对象状态的撤销和恢复功能。当需要在对象中实现撤销操作或者恢复到先前状态的功能时,备忘录模式是一种有效的设计模式。它可以让对象保存其内部状态的快照,并在需要时进行恢复,从而实现撤销和恢复的功能
优缺点
优点:
- 提供状态恢复机制:允许用户方便地回到历史状态
- 封装状态信息:用户不需要关心状态的保存细节
缺点:
- 资源消耗:如果对象的状态复杂,保存状态可能会占用较多资源
1. 各个角色介绍
1.1 备忘录(Memento)
- 负责存储原发器对象的内部状态。备忘录可以保持原发器的状态的一部分或全部信息
1.2 原发器(Originator)
- 创建一个备忘录对象,并且可以使用备忘录对象恢复自身的内部状态。原发器通常会在需要保存状态的时候创建备忘录对象,并在需要恢复状态的时候使用备忘录对象
1.3 负责人(Caretaker)
- 负责保存备忘录对象,但是不对备忘录对象进行操作或检查。负责人只能将备忘录传递给其他对象
2. UML图
备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态
3. 具体例子和代码
角色分配
-
Memento:备忘录
-
Originator:原发器
-
Caretaker:负责人
3.1 备忘录实体
- Memento
package com.vinjcent.prototype.memento; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author vinjcent * @description 备忘录 * @since 2024/5/16 20:11 */ @Data public class Memento { @ApiModelProperty(value = "状态") private String state; public Memento(String state) { this.state = state; } }
3.2 原发器实体
- Originator
package com.vinjcent.prototype.memento; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author vinjcent * @description 原发器 * @since 2024/5/16 20:16 */ @Data public class Originator { @ApiModelProperty(value = "状态") private String state; public Memento saveStateToMemento() { return new Memento(state); } public void getStateFromMemento(Memento memento) { state = memento.getState(); } }
3.3 负责人
- CareTaker
package com.vinjcent.prototype.memento; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.ArrayList; import java.util.List; /** * @author vinjcent * @description 负责人 * @since 2024/5/16 20:23 */ @Data public class CareTaker { @ApiModelProperty(value = "备忘录列表") private List
mementoList = new ArrayList (); public void add(Memento state) { mementoList.add(state); } public Memento get(int index) { return mementoList.get(index); } } 3.4 测试主函数
package com.vinjcent.prototype.memento; /** * @author vinjcent * @description 备忘录模式 * @since 2024/5/16 20:24 */ public class Main { public static void main(String[] args) { // 原发器 Originator originator = new Originator(); // 负责人 CareTaker careTaker = new CareTaker(); originator.setState("State #1"); originator.setState("State #2"); // 让负责人记录当前备忘录的状态 careTaker.add(originator.saveStateToMemento()); originator.setState("State #3"); // 让负责人记录当前备忘录的状态 careTaker.add(originator.saveStateToMemento()); originator.setState("State #4"); System.out.println("Current State: " + originator.getState()); originator.getStateFromMemento(careTaker.get(0)); System.out.println("First saved State: " + originator.getState()); originator.getStateFromMemento(careTaker.get(1)); System.out.println("Second saved State: " + originator.getState()); } }
- 测试结果
4. 使用场景
- 当需要提供一种撤销机制,允许用户回退到之前的状态时
- 测试结果
- CareTaker
- Originator
- Memento
-
- 负责保存备忘录对象,但是不对备忘录对象进行操作或检查。负责人只能将备忘录传递给其他对象
- 创建一个备忘录对象,并且可以使用备忘录对象恢复自身的内部状态。原发器通常会在需要保存状态的时候创建备忘录对象,并在需要恢复状态的时候使用备忘录对象
- 负责存储原发器对象的内部状态。备忘录可以保持原发器的状态的一部分或全部信息
- 资源消耗:如果对象的状态复杂,保存状态可能会占用较多资源
还没有评论,来说两句吧...