一、生活场景

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 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 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

java备忘录模式应用场景_Java描述设计模式(24):备忘录模式相关推荐

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

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

  2. java策略模式详解_Java经典设计模式之策略模式原理与用法详解

    本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...

  3. Java啤酒生产系统描述_Java描述设计模式(02):简单工厂模式

    一.生活场景简介 1.引入场景 订餐流程简单描述 1).食品抽象类,规定食品的基础属性操作 2).鱼类,鸡肉类食品类扩展 3).订餐流程类,根据食品名称,加工指定类型食品 4).模拟客户端预定操作 2 ...

  4. java备忘录模式 类图,Android编程设计模式之备忘录模式详解

    本文实例讲述了Android编程设计模式之备忘录模式.分享给大家供大家参考,具体如下: 一.介绍 备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态,这有点像我们平时 ...

  5. java对接支付宝微信银联_经典设计模式之策略模式【如何重构聚合支付平台,对接【支付宝,微信,银联支付】】(示例代码)...

    写在前面:设计模式源于生活,而又高于生活! 为什么要使用设计模式重构代码 使用设计模式可以重构整体架构代码.提高代码复用性.扩展性.减少代码冗余问题. Java高级工程师装逼的技能! 什么是策略模式 ...

  6. python中代理模式分为几种_Python设计模式之代理模式实例详解

    本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env py ...

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

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

  8. Java啤酒生产系统描述_Java描述设计模式(03):工厂方法模式

    一.工厂方法模式 1.生活场景 系统常见的数据导出功能:数据导出PDF.WORD等常见格式. 2.工厂方法模式 是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性 ...

  9. Java啤酒生产系统描述_Java描述设计模式(04):抽象工厂模式

    一.抽象工厂模式 1.生活场景 汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂. 2.抽象工厂模式 1) 抽象工厂模式:定义了一 ...

最新文章

  1. 任务栏窗口和状态图标的闪动 z
  2. (笔试题)删除K位数字
  3. python读取excel表格-python读取excel表格中的数据
  4. 流式计算新贵Kafka Stream设计详解--转
  5. 基于3G网络的汽车防盗报警系统视频监控设计[图]
  6. 面积积分_被积函数的奇偶性问题(定积分、重积分、线积分、面积分)
  7. STM32基于SPI和AD7192的数据采集
  8. Sql Server参数化查询之where in和like实现之xml和DataTable传参
  9. 关于Bootstrap的理解
  10. 三次元的世界里,机械臂的手活儿也无敌了
  11. 【MPLS ***】基础知识:模型、PE路由器、VRF、RD及RT
  12. simulink教程(自动控制原理)
  13. Android 打开淘宝商品详情
  14. transform: translateY(-100%)偏移实现上滑隐藏导航栏
  15. 佳能LBP2900打印机无法正常打印.用32位驱动安装正常
  16. 5G核心网技术基础自学系列 | 用户面处理
  17. 如何在Altium Designer 20中增加原件库
  18. .NET自助建站系统开发框架源码 PC端+WAP端+微信端
  19. 国产音频芯片:音频ADC,音频DAC,音频CODEC,音频CLASS D如何竞争欧美大牌?
  20. 手机自带html怎么卸载,怎么删除智能手机系统里自带的软件

热门文章

  1. 金属拉链滑块行业调研报告 - 市场现状分析与发展前景预测
  2. 电泳涂装行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  3. zabbix4.0添加mysql报警_Zabbix 3.4.3实现企业微信报警
  4. iphone7计算机隐藏,Iphone7:3Dtouch5个隐藏小功能,你知道吗?
  5. 只需一行代码,就能导入所有的Python库?
  6. 芯片破壁者:硅谷“摩西”肖克利和他的半导体实验室
  7. 5G 时代,优酷推出的帧享究竟是什么?
  8. 新手入坑自动驾驶,我是这么学习的......
  9. 高架桥侧翻:物联网可以做什么?
  10. 前端必会!四步带你吃透浏览器渲染基本原理