本文源码:github·点这里 || gitee·点这里
常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放。下面基于备忘录设计模式来描述该场景流程。
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
备忘录模式属于行为型模式,其用意在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。后续可将该对象恢复到原先保存的状态。备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作。
负责保存对象状态的记录,即originator内部状态。
创建一个含有当前的内部状态的备忘录对象,用来保存状态。
提供合理的方式,负责保存多个备忘录对象。
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(); } }
备忘录模式提供一种可以恢复状态的机制,实现状态的封装,能够比较方便地回到某个历史的状态;常常与命令模式和迭代器模式一同使用。如果类的成员变量过多,会占用比较大的内存资源,为了节约内存,备忘录模式可以和原型模式配合使用。
ctrl+z
撤销;github·地址 https://github.com/cicadasmile/model-arithmetic-parent gitee·地址 https://gitee.com/cicadasmile/model-arithmetic-parent
如对本文有疑问, 点击进行留言回复!!
Springboot项目因为kackson版本问题启动报错解决方案
Java多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask详解
网友评论