备忘录模式

合集下载

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

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

设计模式(⼗⼋)备忘录模式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.如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态。

简单使用定义备忘录public class Memo {public int checkPoint;public int lifeValue;@Overridepublic String toString() {return "Memo [checkPoint=" + checkPoint + ", lifeValue=" + lifeValue + "]";}}定义管理器public class Manager {Memo memo;public void save(Memo memo) {this.memo = memo;}public Memo getMemo() {return memo;}}定义游戏public class Game {private int mCheckPoint = 1;private int mLifeValue = 100;public void play() {System.out.println("玩游戏:" + String.format("第%d关", mCheckPoint));mLifeValue -= 10;System.out.println("进入下一关");mCheckPoint++;System.out.println(String.format("到达%d关", mCheckPoint));}public void exit() {System.out.println("-------------------");System.out.println("退出游戏前属性:" + this.toString());System.out.println("退出游戏");System.out.println("-------------------");}public Memo createMemo() {Memo memo = new Memo();memo.checkPoint = mCheckPoint;memo.lifeValue = mLifeValue;return memo;}public void restore(Memo memo) {mCheckPoint = memo.checkPoint;mLifeValue = memo.lifeValue;System.out.println("恢复后的游戏属性:" + this.toString());}@Overridepublic String toString() {return "Game [mCheckPoint=" + mCheckPoint + ", mLifeVal ue=" + mLifeValue + "]";}}使用public class Main {public static void main(String[] args) {Game game = new Game();//打游戏game.play();Manager manager = new Manager();//存档manager.save(game.createMemo());//退出游戏game.exit();//恢复游戏Game newGame = new Game();newGame.restore(manager.getMemo());}}输出结果玩游戏:第1关进入下一关到达2关-------------------退出游戏前属性:Game [mCheckPoint=2, mLifeValue=90]退出游戏-------------------恢复后的游戏属性:Game [mCheckPoint=2, mLifeValue=90] 小结备忘录模式是在不破坏封装的条件下,通过备忘录对象存储另外一个对象内部的快照,在将来合适的时候把这个对象还原到存储起来的状态。

行政文件管理中的备忘录模版分享

行政文件管理中的备忘录模版分享

行政文件管理中的备忘录模版分享备忘录模板
日期:[填写日期]
发件人:[填写发件人]
收件人:[填写收件人]
主题:[填写主题]
正文:
尊敬的各位同事,
根据我们公司行政文件管理的需要,我在此分享一份备忘录模板,以便大家在日常工作中能够更加高效地进行文件管理和沟通。

以下是
备忘录模板的具体内容:
1. 备忘录的格式
备忘录的格式应简洁明了,包括日期、发件人、收件人和主题等
要素。

在正文部分,应清晰地表达事项、要求或提醒,并在结尾处署
名发件人。

2. 备忘录的标题
备忘录的标题应准确概括备忘录的主题,以便收件人能够迅速了
解备忘录的内容。

同时,标题也应具有一定的吸引力,以提高收件人
的阅读兴趣。

3. 备忘录的正文
备忘录的正文应简明扼要,语句通顺,表达清晰。

在正文中,可以使用项目符号或编号来列举事项,以便收件人更好地理解和记忆。

同时,可以使用粗体、斜体或下划线等方式来强调重要信息。

4. 备忘录的附件
如果备忘录需要附带相关文件或资料,可以在正文中提及,并在备忘录下方注明附件的名称和数量。

同时,应在备忘录发送前确认附件的完整性和可读性。

5. 备忘录的发送和保存
备忘录可以通过电子邮件、即时通讯工具或打印纸质版等方式发送给收件人。

同时,发件人应在备忘录发送后妥善保存备份,以备日后查阅或追溯。

希望以上备忘录模板能够对大家在行政文件管理中有所帮助。

如果有任何疑问或建议,请随时与我联系。

谢谢!
祝好!
[填写发件人姓名]
[填写发件人职务]
[填写发件人联系方式]。

备忘录模式MEMENTO

备忘录模式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章 备忘录模式

22 第22章 备忘录模式

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

备忘录的写作格式

备忘录的写作格式

备忘录的写作格式通常包括以下部分:
1. 标题:备忘录的标题应该简洁明了,直接标示文种名称,如“备忘录”。

2. 发文人或发文单位名称:在标题之下,正文之上,应该写明发文人或发文单位名称,如“总经理办公室”。

人员姓名的前面可以根据需要标示其职务。

3. 收文人或收文单位名称:在发文人或发文单位名称之后,应该写明收文人或收文单位名称,如“人力资源部”。

人员姓名的前面可以根据需要标示其职务。

4. 地址:一般包括发文人或发文单位地址和收文人或收文单位地址。

地址一项写在左上角编号处的下面,其格式与书信的写法相同。

5. 发文日期:即写明备忘录发出的日期。

6. 正文:这是备忘录的主要部分,应该简洁明了地说明主题和相关事件。

7. 结束语:如果需要,可以写明结束语,表达感谢、祝贺等情感。

8. 签署:在备忘录的末尾,应该签署发文人或收文人的姓名和日期。

以上是备忘录的基本写作格式,具体格式可能会因不同的应用场景而有所不同。

备忘录格式

备忘录格式

备忘录格式
备忘录
时间:2020年7月7日
事项:
1.按时参加会议,研讨和探讨项目的落实情况,并留下有效的结论。

2.整理文件,统一添加logo。

3.运用字体设计工具对营销品进行形象的设计,便于宣传推广。

4.参加活动,积极参与,提出自己的见解。

5.负责招聘,编写招聘公告,并发布在社交媒体平台上。

任务:
1.及时回复各类需求信息,并及时回复各类反馈。

2.协助完成品牌营销视频的自媒体推广,协助撰写微博、朋友圈等营销文章。

3.在营销政策上实施创新措施,开展与此类政策相关的活动策划。

4.及时发布商品促销活动信息,参加商城管理业务,统一维护网络营销活动。

5.主动邀请负责人进行绩效考核,并及时反馈,提高合作效率。

备注:本任务于2020年7月7日正式开始执行,时间至2020年7月17日结束。

签字:
发布人:
接受人:。

正式备忘录格式

正式备忘录格式

正式备忘录格式
正式备忘录格式一般包括以下要素:
1.标题:正式备忘录的标题通常简洁明了,反映备忘录的主题内容,例如“关于会议安排的备忘录”。

2.收件人:明确指出备忘录的接收对象,这通常是某个部门、机构或个人。

3.发件人:标明备忘录是由谁发出,包括发件人的姓名、职务和部门等信息。

4.日期:注明备忘录的发出日期,格式为“年-月-日”。

5.主题:简要描述备忘录的主题内容,便于收件人了解备忘录的主要目的。

6.正文:这是备忘录的主体部分,应清晰、简洁地表达出发件人的意图和要求,同时要符合正式的文体和语气。

正文应分段书写,条理清晰。

7.结尾:通常会表达对收件人的感谢或要求收件人回复等,以示礼貌和关注。

8.附件:如有附件,应在结尾处注明,以便收件人查阅。

9.签名:发件人应在备忘录末尾签署姓名和日期,以示负责。

以下是一个示例:
[XXXXX]
XXXX年XX月XX日
尊敬的XX先生/女士:
关于XXXX事项的备忘录
我代表XX部门,特此向您发出此份备忘录,以记录我们之间的沟通和协商。

主题:关于XXXX事项的沟通和协商
正文:在此次会议中,我们讨论了关于XXXX事项的细节,并就相关问题进行了深入交流。

经过讨论,我们达成了一致意见,并决定采取以下措施:[具体的措施和行动计划]。

结尾:感谢您对此次会议的关注和支持。

如有任何疑问或建议,请随时与我们联系。

期待我们的进一步合作。

此致
敬礼!
附件:[如有附件,在此处列出]
[XXXXX]。

设计模式:备忘录(Memento)模式

设计模式:备忘录(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. 软件开发中的版本控制:在软件开发中,可以使用备忘录模式来记录每个版本的代码快照,方便进行版本控制和回溯。

备忘录模式的应用非常广泛,可以帮助我们记录和恢复状态,提高软件的可维护性和用户体验。

备忘录模式

备忘录模式

Page 4
Memento
Memento模式是用一个Memento对象来存储另外一个对象的内部状 态(前提条件是不破坏封装),将一个对象的状态捕捉住,并外部化 存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的 状态。备忘录模式常常与命令模式和迭代器模式一同使用。 Memento模式中三个角色: Memento(备忘录)。备忘录存储原发器的内部状态。原发器根据需 要决定备忘录存储原发器的哪些内部状态;防止原发器以外的其他对 象访问备忘录。 Originator(原发器)。创建一个备忘录,用以记录当前时刻他的内 部状态;使用备忘录恢复内部状态。 Caretaker(负责人)。负责保存好备忘录。不能对备忘录的内容进 行操作或检查。
Page 3
Memento
备忘录模式 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之 外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 角色扮演游戏(RPG)中,玩家 需要扮演游戏中的一位或者多位 角色,在虚拟的世界中进行冒险。 打RPG游戏的时候经常在打大 boss之前把游戏保存一下,如果 死了,就重新来。其实这就是备 忘录模式。 代码
Memento
观世音甘泉活树的故事
却说孙大圣保唐僧西行,路过万寿山五庄观,与道童发生口角,一时发怒, 把人参果树推到。只见“那棵树倒在地下,土开根现,叶落枝枯。” 大圣只好请菩萨救活人参果树。菩萨将杨柳枝蘸出瓶中甘露,道:“扶起 树来,从头浇下,自然根皮相合,叶长芽生,枝青果出。”菩萨将杨柳枝 细细撒上,口中又念着经咒,不多时,撒净那舀出之水,只见那树果然依 旧青枝绿叶浓郁阴森,上有二三十个人参果。 这就是说,果树的状态保存在菩萨的甘露之中,菩萨可以从甘露中将果树 的状态恢复过来。这就是备忘录模式的应用,果树是发起人角色,甘泉是 备忘录角色,而菩萨扮演负责人角色。

备忘录的格式和范文

备忘录的格式和范文

备忘录的格式和范文备忘录(Memo)是一种常见的商业文书,用于在组织内部传递信息,通常包含了对特定问题、任务或决策的简要记录和说明。

以下是备忘录的一般格式和一个简单的范例:一、备忘录格式1.标题:在备忘录的开头写上一个简洁而明确的标题,以便读者能够迅速了解备忘录的主题。

2.日期:在标题下方写上备忘录的日期,以便读者知道备忘录的时间背景。

3.发件人和收件人信息:在备忘录的开头,注明发件人和收件人的姓名、职务和日期。

4.正文:正文部分包含备忘录的具体内容。

段落要简洁明了,使用清晰的语言,突出重点。

5.结论或建议:如果备忘录的目的是提出建议或得出结论,可以在结尾部分明确指出。

6.附件:如果有附件需要参考,可以在备忘录末尾注明,并在正文中提及。

7.签名:备忘录的最后留有发件人的签名或署名,确保备忘录的真实性和权威性。

二、备忘录范文公司备忘录日期:2024年1月10日发件人:[你的姓名、职务]收件人:[收件人的姓名、职务]主题:新年度销售计划尊敬的各位,在新的一年开始之际,我想与大家分享一下我们的销售计划。

根据最近的市场分析和客户反馈,我们制定了一份全面的销售策略,以提高我们在市场上的竞争力。

一、具体计划包括:1. 产品创新:推出一系列新产品,以满足客户不断变化的需求。

2. 市场拓展:扩大我们的市场份额,重点关注新兴市场和潜在客户群体。

3.客户服务升级:加强客户服务团队,提高客户满意度。

请各位部门经理在接下来的两周内回馈您的想法和建议,我们将在随后的会议中进一步讨论和完善这一计划。

谢谢大家的合作![你的签名][你的职务][公司名称]。

如何在华为手机上设置备忘录

如何在华为手机上设置备忘录

如何在华为手机上设置备忘录备忘录是我们日常生活中不可或缺的工具,它可以帮助我们记录重要的事项、提醒我们的日程安排,以及管理我们的待办事项。

在华为手机上,设置备忘录非常简单且方便。

本文将介绍如何在华为手机上设置备忘录,以及如何充分利用备忘录功能提高工作和生活效率。

在华为手机上,备忘录功能通常可以在系统自带的“便签”应用中找到。

以下是在华为手机上设置备忘录的步骤:1. 打开手机主屏幕,找到并点击“便签”应用图标。

通常,它的图标是一个纸片上的笔。

2. 进入“便签”应用后,你会看到一个空白的页面,上方有一个“新建”按钮。

点击“新建”按钮以创建一个新的备忘录。

3. 在新建备忘录页面,你可以输入备忘录的标题和内容。

备忘录的标题应该简明扼要,能够准确表达备忘录的主题。

内容部分可以用来详细描述备忘录的内容、提醒事项等。

4. 在输入标题和内容后,你可以选择保存备忘录。

通常,保存的方式是点击屏幕上的“保存”按钮。

保存后,备忘录将被添加到备忘录列表中。

5. 如果你想查看已保存的备忘录,可以返回到备忘录列表页面。

在列表中,你可以看到备忘录的标题和部分内容。

点击任意一个备忘录,即可查看备忘录的详细内容。

华为手机的备忘录功能还具备一些其他的实用功能,可以帮助我们更好地管理备忘录和提醒事项。

以下是一些备忘录功能的介绍:1. 标签:在创建备忘录时,你可以给备忘录添加标签。

标签可以帮助你分类和组织备忘录,便于查找和管理。

比如,你可以给工作相关的备忘录添加“工作”标签,给生活相关的备忘录添加“生活”标签。

2. 提醒:华为手机的备忘录功能还可以设置提醒功能,帮助我们在特定的时间或地点提醒事项。

在创建备忘录时,你可以选择设置提醒时间和提醒方式。

比如,你可以设置一个会议备忘录,在会议开始前15分钟收到提醒。

3. 分享:如果你想与他人分享备忘录,华为手机的备忘录功能也提供了分享功能。

你可以通过短信、邮件等方式将备忘录发送给他人,方便协作和沟通。

备忘录模式和状态模式的区别和联系

备忘录模式和状态模式的区别和联系

备忘录模式和状态模式的区别和联系设计模式是面向对象编程的重要概念之一。

其中备忘录模式(Memento Pattern)和状态模式(State Pattern)都是行为型模式,用来处理对象之间的交互。

虽然这两种模式的作用类似,但是它们具有不同的优劣势和适用场景。

接下来,本文将从备忘录模式和状态模式的概念、实现方式、使用场景,以及它们的区别和联系等多个方面来详细探讨。

一、备忘录模式1.1概念备忘录模式是一种对象行为型模式,用于在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态。

通过备忘录模式,可以在需要的时候将对象恢复到之前的某个状态。

1.2实现备忘录模式的核心是备忘录类,它用于保存原始对象的内部状态。

备忘录类通常包含了保存状态的接口和读取状态的接口,以及一个内部的状态属性。

在备忘录模式中,原始对象是拥有备忘录类的一个成员变量,它需要使用备忘录类来保存当前状态,也可以使用备忘录类来恢复之前的状态。

1.3使用场景备忘录模式通常用于以下场景:1)需要保存或恢复对象的历史状态2)希望在不破坏封装性的前提下捕获和恢复对象状态3)当需要回滚事物的时候,可以使用备忘录来恢复到之前的状态二、状态模式2.1概念状态模式是一种对象行为型模式,它允许对象在其内部状态改变时改变其行为。

状态模式将状态封装成独立的类,并将动作委托到表示状态的对象中去。

状态模式在行为随状态改变的场景中比较适用。

2.2实现在状态模式中,需要定义一个状态接口来封装对象的不同状态。

每个状态对应了一个具体的类,表示不同的状态。

在状态切换时,需要将对象的状态切换到相应的状态类中。

在状态类中,可以定义不同的动作,这些动作实现了当前状态的具体行为。

2.3使用场景状态模式通常用于以下场景:1)当一个对象的行为取决于它的状态,并需要在运行时动态地改变对象的行为时2)当系统中存在多个状态,且不同的状态会对应相应的行为时3)当一个核心对象需要多个不同的状态,并且需要切换状态时三、备忘录模式和状态模式的区别和联系备忘录模式和状态模式在某些情况下可以用来处理相似的问题,但是它们根据问题的需求使用的方法和实现方式有所不同。

备忘录模式课件

备忘录模式课件
备忘录模式
本章教学内容
备忘录模式
模式动机与定义 模式结构与分析 模式实例与解析 模式效果与应用
模式扩展
备忘录模式
模式动机
为了使软件的使用更加人性化,对于误操作,我们需要 提供一种类似“后悔药”的机制,让软件系统可以回到 误操作前的状态,因此需要保存用户每一次操作时系统 的状态,一旦出现误操作,可以把存储的历史状态取出 即可回到之前的状态。
备忘录模式
模式分析
备忘录模式属于对象行为型模式,负责人向原发器请求一个备 忘录,保留一段时间后,再根据需要将其送回给原发器,其顺 序图如下所示:
备忘录模式
备忘录模式实例与解析
实例:用户信息操作撤销 • 某系统提供了用户信息操作模块,用户可以修改自己 的各项信息。为了使操作过程更加人性化,现使用备 忘录模式对系统进行改进,使得用户在进行了错误操 作之后可以恢复到操作之前的状态。
备忘录模式
备忘录模式实例与解析
实例:用户信息操作撤销
备忘录模式
备忘录模式实例ห้องสมุดไป่ตู้解析
备忘录模式
模式结构
Originator - state : + restoreMemento (Memento m) + createMemento () ... Memento - state : + getState () + setState ( state) ...
return new Memento(state);
现在大多数软件都有撤销 (Undo) 的功能,快捷键一般 都是Ctrl+Z,目的就是为了解决这个后悔的问题。
备忘录模式
模式动机
备忘录模式

备忘录 模板

备忘录 模板

备忘录模板
尊敬的各位同事:
在工作中,我们经常会遇到各种琐碎的事务需要处理,为了更好地管理和安排工作,我特意整理了这份备忘录模板,希望能够对大家有所帮助。

一、日期,(填写日期)。

二、重要事项:
1. 本周工作重点安排,(列出本周需要重点关注的工作内容,如会议安排、项目推进等)。

2. 待办事项清单,(将个人待办事项列于此处,可按优先级和时间安排进行排序)。

3. 下周工作计划,(提前规划下周工作内容,确保工作有序进行)。

三、会议安排:
1. 会议时间,(填写会议时间)。

2. 会议地点,(填写会议地点)。

3. 会议议题,(填写会议议题,确保会议目的明确)。

四、其他事项:
1. 重要通知,(将重要通知内容详细罗列,确保每位同事都能及时了解)。

2. 其他事项,(可根据实际情况添加其他需要关注的事项)。

以上就是备忘录模板的内容,希望大家在工作中能够认真使用,合理安排时间,高效完成工作。

同时,也希望大家能够在工作中相互配合,共同努力,为公司的发展贡献自己的力量。

谢谢大家的配合!
祝工作顺利!
(您的名字)。

备忘录模式 盛翔

备忘录模式 盛翔

备忘录模式目录备忘录模式动机动机:为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取出即可回到之前的状态。

现在大多数软件都有撤销(Undo)的功能,快捷键一般都是Ctrl+Z,目的就是为了解决这个后悔的问题。

备忘录模式定义备忘录模式备忘录模式备忘录模式由于在备忘录中存储的是原发器的中间状态,因此需要防止原发器以外的其他对象访问备忘录。

备忘录对象通常封装了原发器的部分或所有的状态信息,而且这些状态不能被其他对象访问,也就是说不能在备忘录对象之外保存原发器状态,因为暴露其内部状态将违反封装的原则,可能有损系统的可靠性和可扩展性。

备忘录模式●模式分析●为了实现对备忘录对象的封装,需要对备忘录的调用进行控制:l对于原发器而言,它可以调用备忘录的所有信息,允许原发器访问返回到先前状态所需的所有数据;l对于负责人而言,只负责备忘录的保存并将备忘录传递给其他对象;l对于其他对象而言,只需要从负责人处取出备忘录对象并将原发器对象的状态恢复,而无须关心备忘录的保存细节。

●理想的情况是只允许生成该备忘录的那个原发器访问备忘录的内部状态备忘录模式发起人角色源代码public class Originator {private List<String> states;private int index;public Originator(){states = new ArrayList<String>();index = 0;}public Memento createMemento(){return new Memento(states , index);}public void restoreMemento(Memento memento){ states = memento.getStates();备忘录模式index = memento.getIndex();}public void setState(String state){states.add(state);index++;}public void printStates(){for(String state : states){System.out.println(state);}}}备忘录模式备忘录角色类public class Memento {private List<String> states;private int index;public Memento(List<String> states , int index){ this.states = new ArrayList<String>(states);this.index = index;}public List<String> getStates() {return states;}public int getIndex() {return index;}}备忘录模式负责人角色类public class Caretaker {private Originator o;private List<Memento> mementos = new ArrayList<Memento>();private int current;public Caretaker(Originator o){this.o = o;current = 0;}public int createMemento(){Memento memento = o.createMemento();备忘录模式mementos.add(memento);return current++;}public void restoreMemento(int index){Memento memento = mementos.get(index);o.restoreMemento(memento);}public void removeMemento(int index){mementos.remove(index);}}备忘录模式客户端角色源代码public class Client {public static void main(String[] args) { Originator o = new Originator();Caretaker c = new Caretaker(o);o.setState("state 0");c.createMemento();o.setState("state 1");c.createMemento();o.setState("state 2");备忘录模式c.createMemento();●o.setState("state 3");● c.createMemento();●o.printStates();●System.out.println("-----------------恢复检查点-----------------");● c.restoreMemento(2);●o.printStates();●}●}备忘录模式备忘录模式备忘录模式备忘录模式备忘录模式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

―假如”协议优缺点:
优点:保证发起人对象永远不会处于无效或不自恰状态。 缺点:1。成功的操作必须执行两次。 2。如果在拷贝和原对象均有共享数据,修改原对象或拷贝对 象都会导致数据被修改。
备忘录模式的变种—自述历史模式
• 自述历史模式: 发起人兼顾负责人角色,自己管理自己的状态, 同时备忘录对象做为发起人类的内部类,各个方法私有,保证了发起 人角色自己可以存取备忘录状态,而外部对象则不可以。
涉及角色:
• 1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前 时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可 以根据需要决定Memento存储自己的哪些内部状态。 • 2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防 止Originator以外的其他对象访问备忘录。备忘录有两个接口: Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对 象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状 态所需要的所有数据。 • 3.Caretaker(管理者):负责备忘录Memento,不能对Memento的内容 进行访问或者操作。
– 理想的情况是只允许生成该备忘录的那个原发器访问备忘录的内部状态。
典型的发起人类代码:
package dp.memento; public class Originator { private String state; public Originator(){} // 创建一个备忘录对象 public Memento createMemento(){ return new Memento(this); } // 根据备忘录对象恢复原发器状态 public void restoreMemento(Memento m){ state = m.state; } public void setState(String state) { this.state=state; } public String getState() { return this.state; } }
典型的备忘录类代码
package dp.memento; class Memento { private String state; public Memento(Originator o){ state = o.state; } public void setState(String state) { this.state=state; } public String getState() { return this.state; } }
典型的管理者类代码
package dp.memento; public class Caretaker { private Memento memento; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento=memento; } }
模式扩展
– 备忘录的封装性
• 为了确保备忘录的封装性,除了原发器外,其他类是不能也不应该访问备忘 录类的,在实际开发中,发起人与备忘录之间的关系是非常特殊的,它们要 分享信息而不让其他类知道,实现的方法因编程语言的不同而不同。 • C++可以用friend关键字,使发起人类和备忘录类成为友元类,互相之间可以 访问对象的一些私有的属性; • 在Java语言中可以将两个类放在一个包中,使它们之间满足默认的包内可见 性,也可以将备忘录类作为原发器类的内部类,使得只有原发器才可以访问 备忘录中的数据,其他对象都无法使用备忘录中的数据。
备忘录模式的优缺点ห้องสมุดไป่ตู้
– 备忘录模式的缺点
• 1、如果发起人角色的状态需要完整地存储到备忘录 对象中,那么在资源消耗上面备忘录对象会很昂贵。 • 2、当负责人角色将一个备忘录 存储起来的时候, 负责人可能并不知道这个状态会占用多大的存储空 间,从而无法提醒用户一个操作是否很昂贵。 • 3、当发起人角色的状态改变的时候,有可能这个协 议无效。如果状态改变的成功率不高的话,不如采 取“假如”协议模式 • 4、资源消耗过大,如果类的成员变量太多,就不可 避免占用大量的内存,而且每保存一次对象的状态 都需要消耗内存资源,如果知道这一点大家就容易 理解为什么一些提供了撤销功能的软件在运行时所 需的内存和硬盘空间比较大了。
备忘录模式与其他模式关系
• Memento模式常常与命令(Command)模式和迭代子(Iterator)模 式一同使用。 1.命令(Command)模式: 命令模式把一个请求或 操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端 参数化,对请求牌堆或记录请求日志,可以提供命令的撤销和恢复功 能。 备忘录模式可以结合命令模式来实作Redo/Undo的功能,将操 作前后的物件状态记录下来,并记录所使用的命令,当要实现 Undo/Redo时,只要取回Memento物件以复原物件状态即可。 命令 模式常常需要维护一个历史清单聚集,并使用迭代子模式便历历史清 单的元素,命令模式需要这一功能来实现命令的撤销和恢复。 2.迭 代子(Iterator)模式: 迭代子模式:又叫游标(cursor)模式。迭 代子模式可以顺利的访问一个聚集中的元素而不必暴露聚集的内部表 象。Java聚集:vector、ArrayList 、HashMap等。 迭代子对象在 迭代过程中会存储迭代的状态,包含游标的位置等,这是备忘录模式 的应用。 当备忘录支持多个检查单时,在各个检查点之间进行遍 历需要使用迭代子模式。
模式应用
(1) 几乎所有的文字或者图像编辑软件都提供了撤销 (Ctrl+Z)的功能,即撤销操作,但是当软件关闭再打开 时不能再进行撤销操作,也就是说不能再回到关闭软 件前的状态,实际上这中间就使用到了备忘录模式, 在编辑文件的同时可以保存一些内部状态,这些状态 在软件关闭时从内存销毁,当然这些状态的保存也不 是无限的,很多软件只提供有限次的撤销操作。 (2) 数据库管理系统DBMS所提供的事务管理应用了备忘 录模式,当数据库某事务中一条数据操作语句执行失 败时,整个事务将进行回滚操作,系统回到事务执行 之前的状态。
模式动机
– 为了使软件的使用更加人性化,对于误操作,我们需要提供一种 类似“后悔药”的机制,让软件系统可以回到误操作前的状态, 因此需要保存用户每一次操作时系统的状态,一旦出现误操作, 可以把存储的历史状态取出即可回到之前的状态。 – 现在大多数软件都有撤销(Undo)的功能,快捷键一般都是Ctrl+Z, 目的就是为了解决这个后悔的问题。 – 我们在很多的时候做错了事情需要弥补过错,我们就会想到如果 有“后悔药”就好了,这时候这个备忘录模式的强大功能就会让 我们 – “呵呵呵”解决了。
备忘录模式的结构图
模式分析
– 为了实现对备忘录对象的封装,需要对备忘录的调用进行控制:
• 对于原发器而言,它可以调用备忘录的所有信息,允许原发器访问返回到先 前状态所需的所有数据; • 对于负责人而言,只负责备忘录的保存并将备忘录传递给其他对象; • 对于其他对象而言,只需要从负责人处取出备忘录对象并将原发器对象的状 态恢复,而无须关心备忘录的保存细节。
备忘录模式的变种—―假如”协议模式
• • • • • • • • • • 1.备忘录模式的操作过程: 第1步:客户端为发起人角色创建一个备忘录对象; 第2步:调用发起人对象的某个操作,此操作可以撤销; 第3步:检查发起人对象所处状态的有效性。检查方式可以是发起人 对象的内部自查,也可以由外部对象进行检查; 第4步:如果需要,将发起人操作撤销,根据备忘录对象记录将发起 人状态恢复过来。 2.―假如‖协议操作过程: 第1步:将发起人做一个拷贝; 第2步:在拷贝上执行每个操作; 第3步:检查这个拷贝的状态是否有效和自恰; 第4步:如果检查结果是无效或不自恰,扔掉这个拷贝并触发异常处 理程序; 相反,则在原对象 执行这个操作。对与撤销一个操作并恢 复操作前状态较为复杂和困难的发起人对象来说,是一个 较为谨慎和 有效的做法。
备忘录模式与多重检查点
• 1..多重检查点: • 以上白箱实现、黑箱实现部分的示例实现都是只存储一个状态,也 可以叫只有一个检查点,实际软件中可能需要存储多个状态,或者叫 做有多个检查点。备忘录模式可以将发起人对象的状态存储到备忘录 对象里,可以将发起人对象恢复到备忘录对象所存储的某一个检查点 上。 • 2. 多重检查点的优缺点: • 优点:没有独立的负责人角色,每一个发起人兼顾负责人角色,简单 易懂。 • 缺点:如果有独立的负责人角色,如果有多个发起人角色,可以共享 同一个负责人角色,或在多态性前提下使用多个负责人子类型,但自 述历史模式无法做到代码共享。
备忘录模式的宽接口和白箱实现
• 1.白箱实现的概念: 备忘录角色对所有对象都提供一个接口,即宽 接口,备忘录对象的内部所存储的状态就对所有对象公开。这种实现 叫做―白箱实现‖。 ―白箱‖实现将发起人角色的状态存储在一个大家 都看得到的打分,是破坏封装性的。可以通过程序员的自律,一定程 度上保持封装性。 备忘录模式的―白箱‖实现又叫做―白箱‖备忘录模式。 • 2.白箱实现的优缺点: • 优点:简单。 • 缺点:破坏发起人状态的封装。
多备份实现
• 在负责人中定义一个集合对象来存储多个状态,而 且可以方便地返回到某一历史状态。 • 在备份对象时可以做一些记号,这些记号称为检查 点(Check Point)。在使用HashMap等实现时可以使 用Key来设置检查点。
小结
• 备忘录对象通常封装了原发器的部分或所有的状态信息,而且这些状 态不能被其他对象访问,也就是说不能在该对象之外保存其状态,因 为暴露其内部状态将违反封装的原则,可能有损系统的可靠性和可扩 展性。 • 备忘录模式的主要优点在于它提供了一种状态恢复的实现机制,使得 用户可以方便地回到一个特定的历史步骤,还简化了原发器对象,备 忘录只保存原发器的状态,采用堆栈来存储备忘录对象可以实现多次 撤消操作,可以通过在负责人中定义集合对象来存储多个备忘录;备 忘录模式的主要缺点在于资源消耗过大,因为每一个历史状态的保存 都需要一个备忘录对象。 • 备忘录模式适用情况包括:保存一个对象在某一个时刻的状态或部分 状态,这样以后需要时它能够恢复到先前的状态;如果用一个接口来 让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封 装性。
相关文档
最新文档