如何把网站提交给百度,威海做网站的公司哪家好,建设项目自主验收网站,泰安房产网58同城一、什么是备忘录模式 来到备忘录模式了#xff0c;这个模式我感觉相对简单一些#xff0c;就是备份#xff0c;或者快照。跟前面一样为了加深理解#xff0c;我们引入一个电影情结来说明啥是备忘录模式#xff0c;以来加深大家对备忘录模式的认识。那么#xff0c;在电影…一、什么是备忘录模式 来到备忘录模式了这个模式我感觉相对简单一些就是备份或者快照。跟前面一样为了加深理解我们引入一个电影情结来说明啥是备忘录模式以来加深大家对备忘录模式的认识。那么在电影中谁是此模式应用的王者呢。我想起一位不知道大家有没有看过一个极其经典的电影星爷的《大话西游》。在电影《大话西游》中至尊宝利用月光宝盒不断穿越到紫霞仙子自杀前的时间段试图改变结局。这种时间穿越和状态恢复的机制也可以类比为备忘录模式。 至尊宝“般若波罗蜜~~~~~~~~~” 二当家“哇又升仙啦咦为什么要说‘又’” 至尊宝通过月光宝盒管理者回到过去每次穿越都会恢复到之前保存的状态备忘录从而尝试改变故事的走向。备忘录模式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);}
}//日志输出
至尊宝的状态已更新为: 初次见到紫霞仙子
月光宝盒保存了至尊宝的状态。
至尊宝的状态已更新为: 紫霞仙子自杀
月光宝盒恢复了至尊宝的状态。
至尊宝的状态已更新为: 再次尝试拯救紫霞仙子
月光宝盒保存了至尊宝的状态。
月光宝盒恢复了至尊宝的状态。