Java描述设计模式(24):备忘录模式
程序员文章站
2022-03-25 20:52:01
本文源码: "GitHub·点这里" || "GitEE·点这里" 一、生活场景 1、场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放。下面基于备忘录设计模式来描述该场景流程。 2、场景图解 ......
本文源码:github·点这里 || gitee·点这里
一、生活场景
1、场景描述
常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放。下面基于备忘录设计模式来描述该场景流程。
2、场景图解
3、代码实现
public class c01_inscene { public static void main(string[] args) { record record = new record() ; player player = new player() ; playdata pd1 = new playdata("西游记","19:19") ; playdata pd2 = new playdata("红楼梦","29:19") ; player.setplaydata(pd1); player.saveprogress() ; system.out.println("正在播放:"+ player.getplaydata().getvideoname()+":"+ player.getplaydata().getplaytime()); record.put(new progress(pd1)); system.out.println("===切换播放视频==="); player.setplaydata(pd2); player.saveprogress() ; system.out.println("正在播放:"+ player.getplaydata().getvideoname()+":"+ player.getplaydata().getplaytime()); record.put(new progress(pd1)); system.out.println("===切回上个视频==="); player.resumeprogress(record.get(pd1.getvideoname())); system.out.println("正在播放:"+ player.getplaydata().getvideoname()+":"+ player.getplaydata().getplaytime()); } } /** * 视频播放器 */ class player { private playdata playdata ; public playdata getplaydata() { return playdata; } public void setplaydata(playdata playdata) { this.playdata = playdata; } public progress saveprogress (){ return new progress(playdata) ; } public void resumeprogress (progress progress){ playdata = progress.getplaydata() ; } } /** * 播放进度 */ class progress { private playdata playdata ; public progress (playdata playdata){ this.playdata = playdata ; } public playdata getplaydata() { return playdata ; } } /** * 播放记录 */ class record { private map<string,progress> datamap = new hashmap<>() ; public void put (progress progress){ datamap.put(progress.getplaydata().getvideoname(),progress) ; } public progress get (string videoname){ return datamap.get(videoname) ; } } /** * 播放状态描述 */ class playdata { private string videoname ; private string playtime ; public playdata(string videoname, string playtime) { this.videoname = videoname; this.playtime = playtime; } public string getvideoname() { return videoname; } public void setvideoname(string videoname) { this.videoname = videoname; } public string getplaytime() { return playtime; } public void setplaytime(string playtime) { this.playtime = playtime; } }
执行效果:
正在播放:西游记:19:19 ===切换播放视频=== 正在播放:红楼梦:29:19 ===切回上个视频=== 正在播放:西游记:19:19
二、备忘录模式
1、基础概念
备忘录模式属于行为型模式,其用意在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。后续可将该对象恢复到原先保存的状态。备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作。
2、模式图解
3、核心角色
- 备忘录角色
负责保存对象状态的记录,即originator内部状态。
- 发起人角色
创建一个含有当前的内部状态的备忘录对象,用来保存状态。
- 守护者对象
提供合理的方式,负责保存多个备忘录对象。
4、源码实现
public class c02_memento { public static void main(string[] args) { originator originator = new originator(); caretaker caretaker = new caretaker(); originator.setstate("状态1:state01"); caretaker.add(originator.savestatememento()); originator.setstate("状态2:state02"); caretaker.add(originator.savestatememento()); system.out.println("当前的状态是 =" + originator.getstate()); // 恢复状态 originator.getstatefrommemento(caretaker.get(0)); system.out.println("当前的状态是 =" + originator.getstate()); } } /** * 守护者对象 */ class caretaker { private list<memento> mementolist = new arraylist<>(); public void add(memento memento) { mementolist.add(memento); } public memento get (int index) { return mementolist.get(index); } } /** * 备忘录角色 */ class memento { private string state; public memento(string state) { super(); this.state = state; } public string getstate() { return state; } } /** * 发起人角色 */ class originator { private string state; public string getstate() { return state; } public void setstate(string state) { this.state = state; } public memento savestatememento() { return new memento(state); } public void getstatefrommemento(memento memento) { state = memento.getstate(); } }
三、模式总结
1、优缺点描述
备忘录模式提供一种可以恢复状态的机制,实现状态的封装,能够比较方便地回到某个历史的状态;常常与命令模式和迭代器模式一同使用。如果类的成员变量过多,会占用比较大的内存资源,为了节约内存,备忘录模式可以和原型模式配合使用。
2、应用场景
- 浏览器的前进和回退;
- 数据库备份与还原;
- 编辑器
ctrl+z
撤销; - 虚拟机生成快照与恢复;
- git版本管理,代码的提交和回滚。
四、源代码地址
github·地址 https://github.com/cicadasmile/model-arithmetic-parent gitee·地址 https://gitee.com/cicadasmile/model-arithmetic-parent