备忘录模式
设计模式(十八)备忘录模式

设计模式(⼗⼋)备忘录模式1、引⼊1. 浏览器回退:浏览器⼀般有浏览记录,当我们在⼀个⽹页上点击⼏次链接之后,可在左上⾓点击左箭头回退到上⼀次的页⾯,然后也可以点击右箭头重新回到当前页⾯;2. 数据库备份与还原:⼀般的数据库都⽀持备份与还原操作,备份即将当钱已有的数据或者记录保留,还原即将已经保留的数据恢复到对应的表中;3. 编辑器撤销与重做:在编辑器上编辑⽂字,写错时可以按快捷键Ctrl+Z撤销,撤销后可以按Ctrl+y重做;4. 虚拟机⽣成快照与恢复:虚拟机可以⽣成⼀个快照,当虚拟机发⽣错误时可以恢复到快照的样⼦;5. GIT版本管理:Git是最常见的版本管理软件,每提交⼀个新版本,实际上Git就会把他们⾃动串成⼀条时间线,每个版本都有⼀个版本号,使⽤git reset --hard 版本号,即可回到指定的版本,让代码时刻穿梭回到过去某个历史时刻;6. 棋牌游戏悔棋:在棋牌游戏中,有时下快了可以悔棋,回退到上⼀步重新下。
2、定义:在不破坏封装的前提下,捕获⼀个对象的内部状态,并在该对象之外保存这个状态,这样可以在未来将对象恢复到原先保存的状态。
它是⼀种对象⾏为型模式,其别名为Token。
3、⾓⾊分析(1)Originator(原发器):它是⼀个普通类,可以创建⼀个备忘录,并存储它的当前内部状态,也可以使⽤备忘录来恢复其内部状态,⼀般将需要保存内部状态的类设计为原发器;(2)Memento(备忘录):存储原发器的内部状态,根据原发器来决定保存哪些内部状态。
备忘录的设计⼀般可以参考原发器的设计,根据实际需要确定备忘录类中的属性。
需要注意的是,除了原发器本⾝与负责⼈类之外,备忘录对象不能直接供其他类使⽤,原发器的设计在不同的编程语⾔中实现机制会有所不同;(3)Caretaker(负责⼈):负责⼈⼜称为管理者,它负责保存备忘录,但是不能对备忘录的内容进⾏操作或检查。
在负责⼈类中可以存储⼀个或多个备忘录对象,它只负责存储对象,⽽不能修改对象,也⽆须知道对象的实现细节。
备忘录模式

15.
m_defense = memento.m_defense;
16.
return *this;
17.
}
18. }; 19. //游戏角色
20. class GameRole
21. {
22. private:
23.
int m_vitality;
24.
int m_attack;
25.
int m_defense;
37.
m_defense = memento.m_defense;
38.
}
39.
void Show() { cout<<"vitality : "<< m_vitality<<", attack : "
<< m_attack<<", defense : "<< m_defense<<endl; }
40.
31.
return memento;
32.
}
33.
void Load(Memento memento) //载入进度,只与Memento对象交互,并不牵涉到
Caretake
34.
{
35.
m_vitality = memento.m_vitality;
36.
m_attack = memento.m_attack;
48.
Memento Load(int state) { return m_vecMemento[state]; }
49. private:
50.
vector<Memento> m_vecMemento;
行政文件管理中的备忘录模版分享

行政文件管理中的备忘录模版分享备忘录模板
日期:[填写日期]
发件人:[填写发件人]
收件人:[填写收件人]
主题:[填写主题]
正文:
尊敬的各位同事,
根据我们公司行政文件管理的需要,我在此分享一份备忘录模板,以便大家在日常工作中能够更加高效地进行文件管理和沟通。
以下是
备忘录模板的具体内容:
1. 备忘录的格式
备忘录的格式应简洁明了,包括日期、发件人、收件人和主题等
要素。
在正文部分,应清晰地表达事项、要求或提醒,并在结尾处署
名发件人。
2. 备忘录的标题
备忘录的标题应准确概括备忘录的主题,以便收件人能够迅速了
解备忘录的内容。
同时,标题也应具有一定的吸引力,以提高收件人
的阅读兴趣。
3. 备忘录的正文
备忘录的正文应简明扼要,语句通顺,表达清晰。
在正文中,可以使用项目符号或编号来列举事项,以便收件人更好地理解和记忆。
同时,可以使用粗体、斜体或下划线等方式来强调重要信息。
4. 备忘录的附件
如果备忘录需要附带相关文件或资料,可以在正文中提及,并在备忘录下方注明附件的名称和数量。
同时,应在备忘录发送前确认附件的完整性和可读性。
5. 备忘录的发送和保存
备忘录可以通过电子邮件、即时通讯工具或打印纸质版等方式发送给收件人。
同时,发件人应在备忘录发送后妥善保存备份,以备日后查阅或追溯。
希望以上备忘录模板能够对大家在行政文件管理中有所帮助。
如果有任何疑问或建议,请随时与我联系。
谢谢!
祝好!
[填写发件人姓名]
[填写发件人职务]
[填写发件人联系方式]。
备忘录模式MEMENTO

举例
Amigo 的 mother 对 Amigo 当前的状 态很不满 意:不爱打扮,做事拖拖拉拉,十足马大哈。 mother想对Amigo进行改造,但又唯恐改造后 还不如从前的Amigo好,有可能需要实现“时 光倒流”功能。
//发起人角色
public class Originator { private String state; //工厂方法,返回一个新的备忘录对象 public Memento createMemento { return new Memento(state); } //将发起人恢复到备忘录对象所记载的状态 public void restoreMemento(Memento memento) { this.state = memento.getState(); } //省略状态state的getter和setter方法 }
作业
1. 在一系统中新增帐户时,在表单中需要填写用户名、 密码、联系电话、地址等信息,如果有些字段没有填写 或填写错误,当用户点击“提交”按钮时,需要在新增 页 面上保存用户输入的选项,并提示出错的选项。这 就是利用JavaBean的scope="request"或 scope="session"特性实现的, 即是用备忘录模式实现 的。
备忘录模式UML类图
1. 发起人Originator角色:需要被保存状态以 便恢复的那个对象。 whose state has to be maintained 2. 备忘录 Memento 角色:该对象由 Originator 创建,主要用来保存Originator的内部状态; 可以保护其内容不被发起人(Originator) 对象之外的任何对象所读取。stores the state of the Originator object 3. 管理者 / 负责人 (Caretaker) 角色:负责在适 当的时间保存/恢复Originator对象的状态; 不能对备忘录的内容进行操作或检查 has a handle to the Memento
22 第22章 备忘录模式

备忘录模式
模式扩展
多备份实现 • 在负责人中定义一个集合对象来存储多个状态,而且 可以方便地返回到某一历史状态。 • 在备份对象时可以做一些记号,这些记号称为检查点 (Check Point)。在使用HashMap等实现时可以使用 Key来设置检查点。
本章小结
备忘录模式可以实现在不破坏封装的前提下,捕获 一个对象的内部状态,并在该对象之外保存这个状 态,这样可以在以后将对象恢复到原先保存的状态。 它是一种对象行为型模式,其别名为Token。 备忘录模式包含三个角色:原发器可以创建一个备 忘录,并存储它的当前内部状态,也可以使用备忘 录来恢复其内部状态;备忘录存储原发器的内部状 态,根据原发器来决定保存哪些内部状态;负责人 负责保存备忘录,但是不能对备忘录的内容进行操 作或检查。
备忘录模式
模式分析
备忘录模式属于对象行为型模式,负责人向原发器请求一个备 忘录,保留一段时间后,再根据需要将其送回给原发器,其顺 序图如下所示:
备忘录模式
备忘录模式实例与解析
实例:用户信息操作撤销 • 某系统提供了用户信息操作模块,用户可以修改自己 的各项信息。为了使操作过程更加人性化,现使用备 忘录模式对系统进行改进,使得用户在进行了错误操 作之后可以恢复到操作之前的状态。
state=m.getState();
memento
Caretaker
备忘录模式
模式结构
备忘录模式包含如下角色: • Originator: 原发器 • Memento: 备忘录 • Caretaker: 负责人
备忘录模式
模式分析
由于在备忘录中存储的是原发器的中间状态,因此需 要防止原发器以外的其他对象访问备忘录。
公文备忘录模板

公文备忘录模板
以下是一个公文备忘录的模板,供您参考:
标题:简明扼要地描述备忘录的主题;使用宋体小四号字,加黑加粗居中排版,可适当空出一行行距。
日期:列出备忘录起草时间。
收件人:指明备忘录接收对象,一般填写单位名称或具体负责人姓名。
发件人:即备忘录的起草单位,需注明相关职务、部门和联络方式等。
抄送:如果需要同时抄送给其他部门或个人,请在此栏填写具体名单。
正文:
一、主要内容
在这一部分,应该简洁明了地表述备忘录主要内容,如会议记录、工作计划、任务安排等等。
二、备忘录背景
介绍备忘录的背景及原因,便于对方更好地理解备忘录的主旨和重要性。
三、日程安排或执行情况
根据备忘录的具体主题,应列举执行情况或者日程安排等详细内容,避免含糊不清或没有实际意义的声明。
四、注意事项或建议
如果有特别的须注意的问题或针对问题提出的建议,则在这一部分进行说明,并提出相应的解决方案。
五、联系方式
在文末注明备忘录发起单位的详细联系方式,包括电话、传真、邮编、邮箱等以便对方与你单位进行联络。
特此备忘。
签名:备忘录主管领导和办公室人员签署。
注:这只是一个模板,具体的公文备忘录内容和格式应根据具体情况进行调整。
设计模式:备忘录(Memento)模式

设计模式:备忘录(Memento)模式设计模式:备忘录(Memento)模式⼀、前⾔备忘录模式⽤于保存和恢复对象的状态,相信⼤家看过我前⾯的拙作就会想到原型模式也能保存⼀个对象在某⼀个时刻的状态,那么两者有何不同的呢?原型模式保存的是当前对象的所有状态信息,恢复的时候会⽣成与保存的对象完全相同的另外⼀个实例;⽽备忘录模式保存的是我们关⼼的在恢复时需要的对象的部分状态信息,相当于快照。
备忘录模式⼤家肯定都见过,⽐如在玩游戏的时候有⼀个保存当前闯关的状态的功能,会对当前⽤户所处的状态进⾏保存,当⽤户闯关失败或者需要从快照的地⽅开始的时候,就能读取当时保存的状态完整地恢复到当时的环境,这⼀点和VMware 上⾯的快照功能很类似。
⼆、代码Memento类:1package zyr.dp.memento;23import java.util.ArrayList;4import java.util.List;56public class Memento {78private int menoy;9private ArrayList fruits;1011//窄接⼝,访问部分信息12public int getMenoy(){13return menoy;14 }1516//宽接⼝,本包之内皆可访问17 Memento(int menoy){18this.menoy=menoy;19 fruits=new ArrayList();//每次调⽤的时候重新⽣成,很重要20 }21//宽接⼝,本包之内皆可访问22 List getFruits(){23return (List) fruits.clone();24 }25//宽接⼝,本包之内皆可访问26void addFruits(String fruit){27 fruits.add(fruit);28 }2930 }Gamer 类:1package zyr.dp.memento;23import java.util.ArrayList;4import java.util.Iterator;5import java.util.List;6import java.util.Random;78public class Gamer {910private static String[] FruitsSame={"⾹蕉","苹果","橘⼦","柚⼦"};1112private int menoy;13private List fruits=new ArrayList();14private Random random=new Random();1516public int getMenoy(){17return menoy;18 }1920public Gamer(int menoy){21this.menoy=menoy;22 }2324public void bet(){25int next=random.nextInt(6)+1;26if(next==1){27 menoy+=100;28 System.out.println("⾦钱增加了100,当前⾦钱为:"+menoy);29 }else if(next==2){30 menoy/=2;31 System.out.println("⾦钱减少了⼀半,当前⾦钱为:"+menoy);32 }else if(next==6){33 String f=getFruit();34 fruits.add(f);35 System.out.println("获得了⽔果:"+f+",当前⾦钱为:"+menoy);36 }else {37 System.out.println("⾦钱没有发⽣改变,当前⾦钱为:"+menoy);38 }39 }4041private String getFruit() {4243 String prefix="";44if(random.nextBoolean()){45 prefix="好吃的";46 }47return prefix+FruitsSame[random.nextInt(FruitsSame.length)];4849 }5051public Memento createMemento(){52 Memento m=new Memento(menoy);53 Iterator it=fruits.iterator();54while(it.hasNext()){55 String fruit=(String)it.next();56if(fruit.startsWith("好吃的")){57 m.addFruits(fruit);58 }59 }60return m;61 }6263public void restoreMemento(Memento memento){64this.menoy=memento.getMenoy();65this.fruits=memento.getFruits();66 }6768public String toString(){69return "Menoy:"+menoy+" ,Fruits:"+fruits;70 }7172 }Main类:1package zyr.dp.test;23import zyr.dp.memento.Gamer;4import zyr.dp.memento.Memento;56public class Main {78public static void main(String[] args) {9 Gamer gamer=new Gamer(100);10 Memento memento=gamer.createMemento();11for(int i=0;i<100;i++){12 System.out.println("当前状态:"+i);13 System.out.println("当前⾦额:"+gamer.getMenoy());14 gamer.bet();15if(gamer.getMenoy()<memento.getMenoy()/2){16 System.out.println("⾦钱过少,恢复到以前的状态:");17 gamer.restoreMemento(memento);18 System.out.println("此时状态为:"+gamer);19 }else if(gamer.getMenoy()>memento.getMenoy()){20 System.out.println("⾦钱增多,保存当前状态:");21 memento=gamer.createMemento();22 System.out.println("此时状态为:"+gamer);23 }24try {25 Thread.sleep(500);26 } catch (InterruptedException e) {27 e.printStackTrace();28 }29 }3031 }3233 }运⾏结果:当前状态:0当前⾦额:100⾦钱没有发⽣改变,当前⾦钱为:100当前状态:1当前⾦额:100⾦钱增加了100,当前⾦钱为:200⾦钱增多,保存当前状态:此时状态为:Menoy:200 ,Fruits:[]当前状态:2当前⾦额:200⾦钱增加了100,当前⾦钱为:300⾦钱增多,保存当前状态:此时状态为:Menoy:300 ,Fruits:[]当前状态:3当前⾦额:300⾦钱减少了⼀半,当前⾦钱为:150当前状态:4当前⾦额:150⾦钱减少了⼀半,当前⾦钱为:75⾦钱过少,恢复到以前的状态:此时状态为:Menoy:300 ,Fruits:[]当前状态:5当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:6当前⾦额:300⾦钱增加了100,当前⾦钱为:400⾦钱增多,保存当前状态:此时状态为:Menoy:400 ,Fruits:[]当前状态:7当前⾦额:400⾦钱没有发⽣改变,当前⾦钱为:400当前状态:8当前⾦额:400⾦钱减少了⼀半,当前⾦钱为:200当前状态:9当前⾦额:200⾦钱增加了100,当前⾦钱为:300当前状态:10当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:11当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:12当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:13当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:14当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:15当前⾦额:300⾦钱增加了100,当前⾦钱为:400当前状态:16当前⾦额:400⾦钱没有发⽣改变,当前⾦钱为:400当前状态:17当前⾦额:400⾦钱没有发⽣改变,当前⾦钱为:400当前状态:18当前⾦额:400⾦钱没有发⽣改变,当前⾦钱为:400当前状态:19当前⾦额:400⾦钱没有发⽣改变,当前⾦钱为:400当前状态:20当前⾦额:400⾦钱没有发⽣改变,当前⾦钱为:400当前状态:21当前⾦额:400⾦钱减少了⼀半,当前⾦钱为:200当前状态:22当前⾦额:200⾦钱没有发⽣改变,当前⾦钱为:200当前状态:23当前⾦额:200获得了⽔果:橘⼦,当前⾦钱为:200当前状态:24当前⾦额:200⾦钱增加了100,当前⾦钱为:300当前状态:25当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:26当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:27当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:28当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:29当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:30当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:31当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:32当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:33当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:34当前⾦额:300获得了⽔果:橘⼦,当前⾦钱为:300当前状态:35当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:36当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:37当前⾦额:300当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:38当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:39当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:40当前⾦额:300⾦钱减少了⼀半,当前⾦钱为:150⾦钱过少,恢复到以前的状态:此时状态为:Menoy:400 ,Fruits:[]当前状态:41当前⾦额:400⾦钱减少了⼀半,当前⾦钱为:200当前状态:42当前⾦额:200⾦钱没有发⽣改变,当前⾦钱为:200当前状态:43当前⾦额:200⾦钱没有发⽣改变,当前⾦钱为:200当前状态:44当前⾦额:200⾦钱没有发⽣改变,当前⾦钱为:200当前状态:45当前⾦额:200⾦钱减少了⼀半,当前⾦钱为:100⾦钱过少,恢复到以前的状态:此时状态为:Menoy:400 ,Fruits:[]当前状态:46当前⾦额:400⾦钱没有发⽣改变,当前⾦钱为:400当前状态:47当前⾦额:400⾦钱没有发⽣改变,当前⾦钱为:400当前状态:48当前⾦额:400⾦钱没有发⽣改变,当前⾦钱为:400当前状态:49当前⾦额:400获得了⽔果:⾹蕉,当前⾦钱为:400当前状态:50当前⾦额:400⾦钱没有发⽣改变,当前⾦钱为:400当前状态:51当前⾦额:400⾦钱减少了⼀半,当前⾦钱为:200当前状态:52当前⾦额:200⾦钱增加了100,当前⾦钱为:300当前状态:53当前⾦额:300⾦钱减少了⼀半,当前⾦钱为:150⾦钱过少,恢复到以前的状态:此时状态为:Menoy:400 ,Fruits:[]当前状态:54当前⾦额:400⾦钱减少了⼀半,当前⾦钱为:200当前状态:55当前⾦额:200获得了⽔果:好吃的柚⼦,当前⾦钱为:200当前状态:56当前⾦额:200⾦钱没有发⽣改变,当前⾦钱为:200当前状态:57当前⾦额:200获得了⽔果:好吃的⾹蕉,当前⾦钱为:200当前状态:58当前⾦额:200⾦钱没有发⽣改变,当前⾦钱为:200当前状态:59当前⾦额:200获得了⽔果:⾹蕉,当前⾦钱为:200当前状态:60当前⾦额:200获得了⽔果:苹果,当前⾦钱为:200当前状态:61当前⾦额:200⾦钱没有发⽣改变,当前⾦钱为:200当前状态:62当前⾦额:200⾦钱增加了100,当前⾦钱为:300当前状态:63当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:64当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:65当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:66当前⾦额:300⾦钱没有发⽣改变,当前⾦钱为:300当前状态:67当前⾦额:300⾦钱减少了⼀半,当前⾦钱为:150⾦钱过少,恢复到以前的状态:此时状态为:Menoy:400 ,Fruits:[]当前状态:68当前⾦额:400⾦钱增加了100,当前⾦钱为:500⾦钱增多,保存当前状态:此时状态为:Menoy:500 ,Fruits:[]当前状态:69当前⾦额:500⾦钱增加了100,当前⾦钱为:600⾦钱增多,保存当前状态:此时状态为:Menoy:600 ,Fruits:[]当前状态:70当前⾦额:600⾦钱没有发⽣改变,当前⾦钱为:600当前状态:71当前⾦额:600⾦钱没有发⽣改变,当前⾦钱为:600当前状态:72当前⾦额:600⾦钱没有发⽣改变,当前⾦钱为:600当前状态:73当前⾦额:600⾦钱增加了100,当前⾦钱为:700⾦钱增多,保存当前状态:此时状态为:Menoy:700 ,Fruits:[]当前状态:74当前⾦额:700⾦钱增加了100,当前⾦钱为:800⾦钱增多,保存当前状态:此时状态为:Menoy:800 ,Fruits:[]当前状态:75当前⾦额:800⾦钱没有发⽣改变,当前⾦钱为:800当前状态:76当前⾦额:800获得了⽔果:好吃的柚⼦,当前⾦钱为:800当前状态:77当前⾦额:800⾦钱没有发⽣改变,当前⾦钱为:800当前状态:78当前⾦额:800⾦钱减少了⼀半,当前⾦钱为:400当前状态:79当前⾦额:400⾦钱减少了⼀半,当前⾦钱为:200⾦钱过少,恢复到以前的状态:此时状态为:Menoy:800 ,Fruits:[]当前状态:80当前⾦额:800获得了⽔果:好吃的苹果,当前⾦钱为:800当前状态:81当前⾦额:800⾦钱没有发⽣改变,当前⾦钱为:800当前状态:82当前⾦额:800⾦钱没有发⽣改变,当前⾦钱为:800当前状态:83当前⾦额:800获得了⽔果:好吃的柚⼦,当前⾦钱为:800当前状态:84当前⾦额:800当前⾦额:800⾦钱没有发⽣改变,当前⾦钱为:800当前状态:85当前⾦额:800⾦钱没有发⽣改变,当前⾦钱为:800当前状态:86当前⾦额:800⾦钱增加了100,当前⾦钱为:900⾦钱增多,保存当前状态:此时状态为:Menoy:900 ,Fruits:[好吃的苹果, 好吃的柚⼦]当前状态:87当前⾦额:900⾦钱减少了⼀半,当前⾦钱为:450当前状态:88当前⾦额:450⾦钱增加了100,当前⾦钱为:550当前状态:89当前⾦额:550⾦钱增加了100,当前⾦钱为:650当前状态:90当前⾦额:650⾦钱增加了100,当前⾦钱为:750当前状态:91当前⾦额:750获得了⽔果:柚⼦,当前⾦钱为:750当前状态:92当前⾦额:750⾦钱没有发⽣改变,当前⾦钱为:750当前状态:93当前⾦额:750⾦钱增加了100,当前⾦钱为:850当前状态:94当前⾦额:850⾦钱减少了⼀半,当前⾦钱为:425⾦钱过少,恢复到以前的状态:此时状态为:Menoy:900 ,Fruits:[好吃的苹果, 好吃的柚⼦]当前状态:95当前⾦额:900获得了⽔果:好吃的橘⼦,当前⾦钱为:900当前状态:96当前⾦额:900⾦钱没有发⽣改变,当前⾦钱为:900当前状态:97当前⾦额:900⾦钱增加了100,当前⾦钱为:1000⾦钱增多,保存当前状态:此时状态为:Menoy:1000 ,Fruits:[好吃的苹果, 好吃的柚⼦, 好吃的橘⼦]当前状态:98当前⾦额:1000⾦钱减少了⼀半,当前⾦钱为:500当前状态:99当前⾦额:500⾦钱减少了⼀半,当前⾦钱为:250⾦钱过少,恢复到以前的状态:此时状态为:Menoy:1000 ,Fruits:[好吃的苹果, 好吃的柚⼦, 好吃的橘⼦]运⾏结果本程序的功能是根据循环次数随机的⽣成1~6这6个数字,如果数字是1,则⾦钱加⼀百,如果是⼆,则⾦钱减半,如果是6,则随机⽣成⽔果,⽔果分为好吃的和不好吃的,在保存的时候只保存好吃的⽔果,恢复的时候就只有好吃的⽔果了。
备忘录模式 应用案例

备忘录模式应用案例
备忘录模式的应用案例包括:
1. 游戏中的存档和读档功能:玩家在进行游戏时,可以随时存档,当需要离开游戏或者游戏意外中断时,可以从存档处继续游戏,保证游戏的进度不会丢失。
2. 撤销和恢复功能:在许多软件中,用户可以进行一系列操作,如果用户想要撤销之前的某个操作,可以使用备忘录模式来记录每个操作,从而实现撤销和恢复功能。
3. 事务管理:在数据库事务处理中,如果一系列操作不能全部完成,就需要回滚操作,将数据恢复到操作之前的状态。
备忘录模式可以记录一系列操作的快照,当需要回滚时,可以恢复到备忘录状态。
4. 网页浏览器的历史记录:用户在浏览网页时,可以通过点击前进或后退按钮浏览已经访问过的页面。
备忘录模式可以记录每个页面的状态,方便用户进行浏览。
5. 电子书的阅读进度:用户在阅读电子书时,可以随时保存阅读进度,下次打开电子书时,可以从上次的阅读进度继续阅读。
6. 软件开发中的版本控制:在软件开发中,可以使用备忘录模式来记录每个版本的代码快照,方便进行版本控制和回溯。
备忘录模式的应用非常广泛,可以帮助我们记录和恢复状态,提高软件的可维护性和用户体验。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
备忘录模式的优缺点
优点: 提供了一种状态恢复的实现机制,使得 用户可以方便地回到一个特定的历史步 骤。 实现了信息的封装。
缺点:
资源消耗过大,如果类的成员变量太多,就不 可避免占用大量的内存,而且每保存一次对象 的状态都需要消耗内存资源。
备忘录模式的应用
(1)几乎所有的文字或者图像编辑软件都提供 了撤销功能,实际上这中间就使用到了备忘录 模式。 (2)数据库管理系统DBMS所提供的事务管理应 用了备忘录模式,当数据库某事务中一条数据 操作语句执行失败时,整个事务将进行回滚操 作,系统回到事务执行之前的状态。
Memento - state : + getState () + setState ( state) ...
return new Memento(state);
Hale Waihona Puke state=m.getState();
memento
Caretaker
模式分析
实例:用户信息操作撤销
某系统提供了用户信息操作模块,用户 可以修改自己的各项信息。为了使操作过程 更加人性化,现使用备忘录模式对系统进行 改进,使得用户在进行了错误操作之后可以 恢复到操作之前的状态。
备忘录模式:在不破坏封装的前提下,捕 获一个对象的内部状态,并在该对象之 外保存这个状态,这样可以在需要时将 对象恢复到原先保存的状态。
模式结构
备忘录模式包含以下三个角色: Originator:发起人 Memento:备忘录 Caretaker:管理者
Originator - state : + restoreMemento (Memento m) + createMemento () ...
备忘录模式
为了使软件的使用更加人性化,对 于误操作,我们需要提供一种类似于 “撤销按钮” 的机制,让软件系统可 以回到误操作前的状态,因此需要保存 用户每一次操作时系统的状态,一旦出 现误操作,便可以把存储的历史状态取 出来即可回到之前的状态。
模式定义
模式结构与分析 模式特点及应用
模式定义
Thank you!