设计模式之备忘录模式

Java37

无论是我们在使用word还是记事本,系统都会为我们提供撤销的功能,这几乎是人人都会使用到的功能,而在我们实际开发中,会不会存在一个很复杂的对象,当更改了其中的某一个属性以后,也提供撤销的功能,可以快速恢复到更新前的状态。提供该功能的模式也正是今天的主题——备忘录模式。

一、概念理解

书中的备忘录解释说,在不破坏封装的情况下,捕获对象的内部状态并将该状态保存在对象外部,以便稍后可以将该对象恢复到其先前保存的状态。

[En]

The memo in the book explains that, without breaking the encapsulation, capture the internal state of an object and save that state outside the object, so that the object can be restored to its previously saved state later.

实际上,它是向一个对象添加一个额外的复制对象。每次我们更改对象的某些属性时,我们都会构建一个副本并将该副本存储在队列中。每当回滚对象时,都会从副本中恢复数据。

[En]

In fact, it is to add an additional copy object to an object. Every time we change some properties on the object, we build a copy and store the copy in a queue. Whenever the object is rolled back, the data is restored from the copy.

很显然需要三个角色:原对象、副本对象、存放副本的队列。

也即书上的三个角色定义:

Originator(发起人角色):负责创建一个备忘录,记录自身需要保存的状态,具备状态回滚功能;即原对象。

Memento(备忘录角色):用于存储Originator的内部状态,且可以防止Originator以外的对象进行访问;即副本对象。

Caretaker(管理员角色):负责存储、提供管理Memento,无法对Memento的内容进行操作和访问;也即存放副本的队列。

为了将这个概念落到实处,我们基于备忘录模式的思想实现了视频草稿箱的功能。

[En]

In order to put the concept on the ground, we realize the function of video draft box based on the idea of memo mode.

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Java

Halo 开源项目学习(七):缓存机制

基本介绍 我们知道,频繁操作数据库会降低服务器的系统性能,因此通常需要将频繁访问、更新的数据存入到缓存。Halo 项目也引入了缓存机制,且设置了多种实现方式,如自定义缓存、Redis、LevelDB ...
Java

Java(6)控制流程

与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流程。 块作用域 我们首先要了解块(block)的概念。 块是指由若干条Java语句组成的语句,并用一对大括号括起来。块确定了变量的作用域...
Java

List的同步类比较

TL;NRs CopyOnWriteArrayList类在多线程顺序读取上有很大的优势,但在随机读取上反而有较大的劣势,且在写入方面性能极差。 Vector类在顺序读取方面性能较差,但在随机读取方面有...
Java

操作线程的方法

操作线程的方法操作线程有很多方法,这些方法可以使线程从某一种状态过渡到另一种状态。 线程的休眠能控制线程行为的方法之一是调用sleep()方法,sleep()方法可以指定线程休眠的时间,线程休眠的时间...
Java

autoJS自动刷网课

自动刷网课,autoJS代码 vscode Ctrl+shift+p打开命令行,连接手机 f5运行 1.点击当前播放器,获取当前播放总时长与播放进度 2.若当前播放进度不等于00:00且总时长与播放进...
Java

设计模式之外观模式

本文通过老王对小王公司整体结构的改造,解释了小王公司的面貌模式。所谓的外观模式实际上是从各种复杂的子系统中抽象出一个接口,以隐藏特定的实现细节。当调用方调用时,您只需要调用接口。为了加深我们的理解,我...
Java

恐怖的Hibernate和JavaFX Table CallBack!

最近在做 JavaFX 应用,不管再怎么避免数据持久化,但面对几十万的数据量的时候也只能乖乖的去配置持久层框架了。 一开始打算还是使用Mybatis,我在做Web的时候就是一只用Mybatis框架,而...
Java

设计模式之状态模式

在实际开发中,订单往往包含订单状态,用户每次操作都要切换相应的状态,每次切换判断当前状态都是必要的,难免会引入一系列判断语句。为了让代码更清晰直观,我们引入了今天的主角国家模式。[En]In actu...
Java

图解定时任务线程池

线程池概念 我们上篇文章分析了ThreadPoolExecutor,如果要用一句话说明它的主要优势,就是线程置换。还有Executors工具类,极大的简化了研发人员工作。 我用一个图重复描述下线程池概...