备忘录模式(Memento Pattern):又叫快照模式或Token模式,通俗的说,备忘录模式就是将一个对象进行备份,提供一种程序数据的备份方法;

在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,这样,以后就可以将该对象恢复到原先保存的状态

备忘录模式的三个角色:

  • 发起人(Originator)角色:该角色记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备份数据
  • 备忘录(Memento)角色:该角色负责存储发起人角色的内部状态
  • 负责人(Caretaker)角色:该角色负责对备忘录角色进行管理,向发起人角色保存和提供备忘录

备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时。

备忘录模式基础代码实现:

public class MementoModle {/** 备忘录模式*/public static void main(String[] args) {Originator originator = new Originator();//发起人originator.setState("初始状态A");// 可以被备份的数据originator.setOtherData("初始状态B");// 不会被备份的数据——一般为不变数据System.out.println("1、\n" + originator);Carataker carataker = new Carataker();// 创建管理者carataker.setMemento(originator.backup());// 添加备份originator.setState("状态A改变");// 修改数据System.out.println("2、\n" + originator);originator.restor(carataker.getMemento());// 恢复备份System.out.println("3、\n" + originator);}
}//发起人
class Originator {private String state;// 需要备份的状态private String otherData;// 不需要备份的数据// get/set方法public String getState() {return state;}public void setState(String state) {this.state = state;}public String getOtherData() {return otherData;}public void setOtherData(String otherData) {this.otherData = otherData;}// 开始备份public Memento backup() {return new Memento(state);}// 恢复备份public void restor(Memento memento) {this.state = memento.restor();}public String toString() {return "需要备份的数据:" + state + "\n无需备的数据:" + otherData;}
}//备忘录
class Memento {private String state;// 备份的状态public Memento(String state) {this.state = state;}public String restor() {return state;}
}//管理者——目的是对备份进行管理,一般以一个集合来管理多备份
class Carataker {private Memento memento;public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}
}

运行结果:

1、
需要备份的数据:初始状态A
无需备的数据:初始状态B
2、
需要备份的数据:状态A改变
无需备的数据:初始状态B
3、
需要备份的数据:初始状态A
无需备的数据:初始状态B

备忘录模式实例——游戏存档:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MementoModle {/** 备忘录模式*/public static void main(String[] args) {//备忘录模式实例测试——游戏存档//创建游戏角色Gamer gamer1=new Gamer("a123","科菲", "女", "法师");Gamer gamer2=new Gamer("b234","策行", "男", "战士");Manager bmanager=new Manager();//备份管理类//添加备份1gamer1.setProgress("关卡2");gamer1.setTime("21:00");gamer2.setProgress("关卡2");gamer2.setTime("21:00");bmanager.setBackUp(gamer1.addBackup());//为角色a123添加备份bmanager.setBackUp(gamer2.addBackup());//为角色b234添加备份//添加备份2gamer1.setProgress("关卡3");gamer1.setTime("22:00");gamer2.setProgress("关卡3");gamer2.setTime("22:00");bmanager.setBackUp(gamer1.addBackup());//为角色a123添加备份bmanager.setBackUp(gamer2.addBackup());//为角色b234添加备份gamer1.setProgress("关卡4");gamer1.setTime("23:00");gamer2.setProgress("关卡4");gamer2.setTime("23:00");//游戏到第4关,玩家a123想重玩关卡2、玩家b234想重玩关卡3//打印游戏当前进度System.out.println(gamer1);System.out.println(gamer2);//恢复备份gamer1.restore(bmanager.getBackUp("a123", "21:00"));//角色a123返回到关卡2gamer2.restore(bmanager.getBackUp("b234", "22:00"));//角色b234返回到关卡3System.out.println(gamer1);System.out.println(gamer2);}
}//备忘录模式实例——游戏存档——根据角色Id和游戏时间备份游戏进度
class Gamer {private String roleId;// 角色idprivate String roleName;// 角色名字private String roleSex;// 角色性别private String roleType;// 角色类型private String progress;// 游戏进度private String time;//游戏时间public String getTime() {return time;}public void setTime(String time) {this.time = time;}public String getProgress() {return progress;}public void setProgress(String progress) {this.progress = progress;}// get/set方法public String getRoleId() {return roleId;}public void setRoleId(String roleId) {this.roleId = roleId;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}public String getRoleSex() {return roleSex;}public void setRoleSex(String roleSex) {this.roleSex = roleSex;}public String getRoleType() {return roleType;}public void setRoleType(String roleType) {this.roleType = roleType;}public Gamer(String roleId,String roleName, String roleSex, String roleType) {this.roleId=roleId;this.roleName = roleName;this.roleSex = roleSex;this.roleType = roleType;}// 备份public BackUp addBackup() {return new BackUp(roleId, progress,time);}// 恢复备份public void restore(BackUp backUp) {this.progress = backUp.getProgress();}//打印角色信息public String toString() {return "角色ID:"+roleId+"\t游戏进度:"+progress;}
}//备份——根据角色Id和游戏时间备份游戏进度
class BackUp {private String roleId;// 角色idprivate String time;//备份时间private String progress;// 游戏进度public String getTime() {return time;}public void setTime(String time) {this.time = time;}public String getRoleId() {return roleId;}public void setRoleId(String roleId) {this.roleId = roleId;}public String getProgress() {return progress;}public void setProgress(String progress) {this.progress = progress;}public BackUp(String roleId, String progress,String time) {this.roleId = roleId;this.progress = progress;this.time=time;}}//备份管理——添加备份/读取备份
class Manager {private Map<String, List<BackUp>> map = new HashMap<String, List<BackUp>>();private List<BackUp> list;public void setBackUp(BackUp backup) {if (map.get(backup.getRoleId()) != null) {list = map.get(backup.getRoleId());list.add(backup);map.put(backup.getRoleId(), list);} else {list = new ArrayList<BackUp>();list.add(backup);map.put(backup.getRoleId(), list);}}public BackUp getBackUp(String roleId,String time) {for(BackUp backup:map.get(roleId)) {if(backup.getTime().equals(time)) {return backup;}}return null;}
}

运行结果:

角色ID:a123    游戏进度:关卡4
角色ID:b234   游戏进度:关卡4
角色ID:a123   游戏进度:关卡2
角色ID:b234   游戏进度:关卡3

参考资料:

《大话设计模式》——程杰

《设计模式(Java版)》

设计模式(Java随笔)—备忘录模式相关推荐

  1. java之备忘录模式,java设计模式之备忘录模式

    java设计模式之备忘录模式 代码无错便是优? 简介: 在不破坏封装性的前提下 , 捕获一个对象的内部状态,并在该对象之外保存这个状态 , 这样以后就可以将该对象恢复到原先保存的状态 . 备忘录模式就 ...

  2. java实现备忘录模式_设计模式之第17章-备忘录模式(Java实现)

    设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...

  3. Java描述设计模式(24):备忘录模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时, ...

  4. java备忘录模式应用场景_Java描述设计模式(24):备忘录模式

    一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放.下面基于备忘录设计模式来 ...

  5. java备忘录代码和解释_Java描述设计模式(24):备忘录模式

    一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放.下面基于备忘录设计模式来 ...

  6. IOS设计模式之四(备忘录模式,命令模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  7. Java笔记-Java中备忘录模式

    首先设计模式代表外招功法,是外招的模板,个人觉得他是为面向对象7个原则而准备的: 面向对象程序设计要考虑7个原则: 单一职责原则:设计目的单一的类: 开放封闭原则:对扩展开发,对修改封闭: 李氏替换原 ...

  8. 一天一种设计模式之二-----备忘录模式

    2019独角兽企业重金招聘Python工程师标准>>> 一.备忘录模式 备忘录模式属于三种设计模式中的行为型模式(另外两种是创建型模式和结构型模式). 定义:在不破坏封闭性的前提下, ...

  9. java memento_备忘录模式-Memento Pattern(Java实现)

    备忘录模式-Memento Pattern Memento备忘录设计模式是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到以前保存的状态. 本文中的场景: 有一款游戏可以随时存档, ...

  10. 设计模式读书笔记-----备忘录模式

    个人比较喜欢玩单机游戏,什么仙剑.古剑.鬼泣.使命召唤.三国无双等等一系列的游戏我都玩过(现在期待凡人修仙传),对于这些游戏除了剧情好.场面大.爽快之外,还可以随时存档,等到下次想玩了又可以从刚开始的 ...

最新文章

  1. np.dot()运算准则
  2. jQuery 超屏加载
  3. 3步告别忙累压力大没成绩
  4. 关于kafka生产者相关监控指标的理解(未解决)
  5. 关于女人强势表现和强势心理
  6. Android P 网络报错 : java.io.IOException: Cleartext HTTP traffic to ***.com not permitted
  7. github private链接访问_如何将Jenkins链接到私有Github存储库?
  8. POJ 2039 Floyd
  9. 【Tensorflow】【损失函数】交叉熵数据验证(下)---BinaryCrossentropy二分类
  10. json字符串转对象数组
  11. 一些常见监控服务如Nagios、Cacti和Zabbix的搭建
  12. VB VBA 文本框回车键换行
  13. HTML5学完就去浪迹天涯的我...
  14. VS隐藏菜单插件 Hide Main Menu
  15. ECCV 2020 目标检测论文大盘点(49篇论文)
  16. android 蓝牙耳机 sco,java – Android:通过Sco蓝牙耳机播放声音
  17. 时间格式转化日期比较指定日期YY-MM 的前某个月
  18. Android 更换 APP logo 无效问题处理
  19. 多个ssh key 和 config 配置
  20. H.265和H.264对比分析(VR视频传输)

热门文章

  1. 在以TCP为连接方式的服务器中,为什么在服务端设计当中需要考虑心跳?
  2. 可以精准解析国内外网站的DNS
  3. 用python给excel文件的第三列添加重复递增数字
  4. 传输加载优化(资源压缩、资源缓存、HTTP2)
  5. ThoughtWorks公司——算法岗位作业题(计算机生成迷宫)
  6. The missing quarter of a million 消失的25万 | 经济学人20230311版社论高质量双语精翻
  7. hutool的 DateUtil工具类相关方法
  8. Java复习第二天和第三天
  9. 我的钱去哪了?当卡被盗刷以后。。。
  10. github创建仓库,Idea上传自己的项目到新创建的仓库中