【设计模式-行为型】备忘录模式
一、什么是备忘录模式
来到备忘录模式了,这个模式我感觉相对简单一些,就是备份,或者快照。跟前面一样为了加深理解,我们引入一个电影情结来说明啥是备忘录模式,以来加深大家对备忘录模式的认识。那么,在电影中谁是此模式应用的王者呢。我想起一位,不知道大家有没有看过一个极其经典的电影,星爷的《大话西游》。在电影《大话西游》中,至尊宝利用月光宝盒不断穿越到紫霞仙子自杀前的时间段,试图改变结局。这种时间穿越和状态恢复的机制也可以类比为备忘录模式。
至尊宝:“般若波罗蜜~~~~~~~~~”
二当家:“哇,又升仙啦!咦?为什么要说‘又’?”
至尊宝通过月光宝盒(管理者)回到过去,每次穿越都会恢复到之前保存的状态(备忘录),从而尝试改变故事的走向。备忘录模式(Memento Pattern) 是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
二、为什么使用备忘录模式
那么我们拿《月光宝盒》来说一下为啥要使用备忘录模式
1. 需要保存对象的历史状态:如文本编辑器中的撤销、恢复功能。在《大话西游》中,至尊宝通过月光宝盒保存了多个历史状态,每次回到过去都是对这些历史状态的恢复。
2. 需要在程序运行时回滚对象状态:如游戏中存储和恢复玩家进度。在电影中,至尊宝利用月光宝盒不断回到过去,每次回到过去都是对之前状态的回滚。
3. 希望避免暴露对象的实现细节:通过备忘录隐藏对象的内部状态。在电影中,月光宝盒作为备忘录,保存了至尊宝的状态,而至尊宝自己和观众都无法直接访问这些状态,只能通过月光宝盒进行恢复。
备忘录模式通过在不破坏封装性的前提下,捕获并保存对象的内部状态,使得对象可以在需要时恢复到之前的状态。这种模式特别适用于需要撤销操作、历史记录功能或状态恢复的场景。在电影《大话西游》中,至尊宝利用月光宝盒不断回到过去,试图改变结局,这种机制很好地体现了备忘录模式的核心思想。
三、备忘录模式示例
1. 定义备忘录接口(Memento)(定义了备忘录的行为)
public interface Memento {
// 备忘录接口,用于保存和恢复状态
}
2. 实现具体备忘录类(ConcreteMemento)(月光宝盒)
-
月光宝盒:用于存储至尊宝的内部状态,通常是一个简单的数据类。月光宝盒对至尊宝以外的其他对象是不可变的。
public class TimeMemento implements Memento {
private String state;
public TimeMemento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
3. 定义发起人(Originator)(至尊宝(孙悟空))
- 至尊宝(孙悟空):负责创建备忘录对象,记录当前时刻的内部状态。至尊宝通过月光宝盒保存和恢复自己的状态
public class BrocadeHorse {
private String state;
public void setState(String state) {
this.state = state;
System.out.println("至尊宝的状态已更新为: " + state);
}
public String getState() {
return state;
}
public Memento saveStateToMemento() {
// 保存当前状态到备忘录
return new TimeMemento(state);
}
public void getStateFromMemento(Memento memento) {
// 从备忘录恢复状态
setState(((TimeMemento) memento).getState());
}
}
4. 定义管理者类(Caretaker)(猪八戒(二当家))
-
猪八戒(二当家):负责保存和管理备忘录,但不能直接操作备忘录的内容。猪八戒通过月光宝盒帮助至尊宝恢复状态。
public class MoonlightBox {
private Memento memento;
public void saveState(BrocadeHorse horse) {
// 保存状态
memento = horse.saveStateToMemento();
System.out.println("月光宝盒保存了至尊宝的状态。");
}
public void restoreState(BrocadeHorse horse) {
// 恢复状态
horse.getStateFromMemento(memento);
System.out.println("月光宝盒恢复了至尊宝的状态。");
}
}
5. 场景重现
public class Main {
public static void main(String[] args) {
// 创建至尊宝对象
BrocadeHorse brocadeHorse = new BrocadeHorse();
// 创建月光宝盒对象
MoonlightBox moonlightBox = new MoonlightBox();
// 至尊宝的状态变化
brocadeHorse.setState("初次见到紫霞仙子");
// 保存状态
moonlightBox.saveState(brocadeHorse);
// 至尊宝的状态变化
brocadeHorse.setState("紫霞仙子自杀");
// 恢复状态
moonlightBox.restoreState(brocadeHorse);
// 至尊宝的状态变化
brocadeHorse.setState("再次尝试拯救紫霞仙子");
// 保存状态
moonlightBox.saveState(brocadeHorse);
// 恢复状态
moonlightBox.restoreState(brocadeHorse);
}
}
//日志输出
至尊宝的状态已更新为: 初次见到紫霞仙子
月光宝盒保存了至尊宝的状态。
至尊宝的状态已更新为: 紫霞仙子自杀
月光宝盒恢复了至尊宝的状态。
至尊宝的状态已更新为: 再次尝试拯救紫霞仙子
月光宝盒保存了至尊宝的状态。
月光宝盒恢复了至尊宝的状态。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/522756.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!