设计模式18之备忘录模式
背景我们直接开篇点题 , 备忘录模式解决什么问题呢?主要用于实现撤销功能 。 很多软件都有撤销功能 , 只需要按Ctrl + Z即可实现撤回 。 数据库也有回滚操作 。 游戏中有存档功能 。 竞速类游戏有时间回溯功能 。
备忘录模式记录一个对象的内部状态 , 如果我们需要撤销当前操作 。 就能使数据恢复到原来的状态 。
什么是备忘录模式“
Without violating encapsulation,capture and externalize an object's internal state so that the object can be restored to this state later.(在不破坏封装性的前提下 , 捕获一个对象的内部状态 , 并在该对象之外保存这个状态 。 这样以后就可将该对象恢复到原先保存的状态 。 )
”
备忘录模式又叫快照模式 。 我们只要记住 , 使用备忘录模式就是实现撤销操作的一种设计模式 。
备忘录模式主要由下面3个要素组成:
“发起人(Originator)角色:记录当前时刻的内部状态信息 , 提供创建备忘录和恢复备忘录数据的功能 , 实现其他业务功能 , 它可以访问备忘录里的所有信息 。 备忘录(Memento)角色:负责存储发起人的内部状态 , 在需要的时候提供这些内部状态给发起人 。 管理者(Caretaker)角色:对备忘录进行管理 , 提供保存与获取备忘录的功能 , 但其不能对备忘录的内容进行访问与修改 。 ”
文章插图
备忘录模式
代码实现Memento
文章插图
Caretaker
文章插图
Originator
文章插图
代码测试@Testpublic void test() {Originator or=new Originator();Caretaker cr=new Caretaker();or.setState("S0");System.out.println("初始状态:"+or.getState());cr.setMemento(or.createMemento()); //保存状态or.setState("S1");System.out.println("新的状态:"+or.getState());or.restoreMemento(cr.getMemento()); //恢复状态System.out.println("恢复状态:"+or.getState());}
测试结果:
初始状态:S0新的状态:S1恢复状态:S0
关于备忘录模式的思考我们再来举一个场景 , 如果你要开发一个流程审批系统 。 流程这里我简化为 。 流程审批里面肯定有驳回功能 , 比如在C流程时我们要驳回到B , 是不是可以使用备忘录模式 。
文章插图
驳回
【设计模式18之备忘录模式】但是你发现了问题没有 , 如果状态很多 , 那么每个状态都需要备份一份 , 这样会占用比较大的内存资源 。 所以在使用备忘录模式的时候要考虑这个风险 。
- 纠结|硬杠红米Note9Pro?iQOO Z1跌至1575,对比之后纠结了!
- 王兴称美团优选目前重点是建设核心能力;苏宁旗下云网万店融资60亿元;阿里小米拟增资居然之家|8点1氪 | 美团
- 长安|长安傍上华为这个大腿,市值暴涨500亿!可见华为影响力之大?
- 巅峰|realme巅峰之作:120Hz+陶瓷机身+5000mAh 做到了颜值与性能并存
- 蛋壳公寓|官媒发声:绝不能让“割韭菜者”一跑了之!
- 看过明年的iPhone之后,现在下手的都哭了
- 直播销售员|石家庄桥西区插上“互联网+”智慧发展之翼
- 精英|业务流程图怎么绘制?销售精英的经验之谈
- 砍单|iPhone12之后,拼多多又将iPhone12Pro拉下水
- 报名啦!宿迁开展第五届“十大科技之星”评选