博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之备忘录模式
阅读量:4036 次
发布时间:2019-05-24

本文共 2429 字,大约阅读时间需要 8 分钟。

备忘录模式真的是很一个比较实用的设计模式,比如说日志恢复、断点重传等等。提供的就是一种“后悔药的机制”。让我们记录下来程序运行过程中的各种状态,还能够恢复。

一、认识备忘录模式

在这里我们以在电脑上下棋为例,通过备忘录模式能够记录下来所走的每一步棋,当突然断点的时候,还能够恢复到某一步,就是这样一个功能。其实备忘录模式的思想就是这样。我们从专业的角度来对其进行一个理解。

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

对于我们用户来说,就算是保存的日志被删了,也不会影响我们正常的功能。我们把上面的例子画一个类图描述一下。

在这里插入图片描述

这个图已经很清晰了,里面主要涉及到三个角色:

(1)Originator:负责创建一个备忘录,就好比是例子中的棋盘。

(2)Mement:备忘录角色,用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Memento,就好比是例子中的电脑日志。

(3)Caretaker: 负责存储备忘录,就好比例子中的电脑。

整个流程逻辑我们捋一遍:电脑把棋盘中的每一步棋保存在日志中。现在三个角色的作用应该就能明白了。

二、代码实现

第一步:新建一个备忘录Step,保存棋盘的每一步棋

//备忘录类:记录棋盘下的每一步棋public class Step {
public int x; public int y; @Override public String toString() {
return "Step [x=" + x + ", y=" + y + "]"; } }

第二步:Originator新建棋盘

public class Chess {
public int x=0; public int y=0; public void play(){
x=x+1; y=y+1; System.out.println(String.format("x=%d,y=%d", x,y)); } public void quit() {
System.out.println("退出前棋盘状态是:"+this.toString()); } public Step createStep(){
Step step = new Step(); step.x=x; step.y=y; return step; } public void restore(Step step){
this.x=step.x; this.y=step.y; System.out.println("恢复到:"+this.toString()); } @Override public String toString() {
return "Chess [x=" + x + ", y=" + y + "]"; }}

第三步:Caretaker创建电脑

public class Computor {
//棋盘会下很多步,我们使用list保存 private ArrayList steps = new ArrayList(); //保存每一步 public void saveStep(Step step){
steps.add(step); } public Step getStep(int i){
return (Step) steps.get(i); }}

第四步:模拟一下整个过程

public class Client {
public static void main(String[] args) {
//1、创建一个棋盘开始下棋 Chess chess= new Chess(); //2、开始下棋,可以有N多步 chess.play(); //3、下一步就把步骤保留下来 Computor computor=new Computor(); computor.saveStep(chess.createStep()); //可以一直下到棋局结束 chess.play(); computor.saveStep(chess.createStep()); //4、保留玩了突然断电,棋盘退出 chess.quit(); //5、来电重启之后,恢复到之前的状态 Chess chess2=new Chess(); //下标0:表示保存的第一步,以此类推 chess2.restore(computor.getStep(0)); }}

我们可以看一下结果输出。

在这里插入图片描述

我们可以看到输出了之前的状态。这就是备忘录模式,程序运行的每一步都会记录保存下来,在数据库里面经常会用到,而且mysql数据库中的回滚机制就是使用了他的思想。

三、分析备忘录模式

优点

(1)提供了一种恢复机制可以是你回复到你保留地任何状态。

(2)对信息封装,即使保存的状态信息丢失了,也不会对程序的正常运行有影响。

缺点

每一次记录的时候都会消耗系统资源,影响系统效率。

模式**

优点

(1)提供了一种恢复机制可以是你回复到你保留地任何状态。

(2)对信息封装,即使保存的状态信息丢失了,也不会对程序的正常运行有影响。

缺点

每一次记录的时候都会消耗系统资源,影响系统效率。

不过备忘录模式使用的场景极其广泛,可以说每一个大型软件都会用到这种模式。

在这里插入图片描述

转载地址:http://ombdi.baihongyu.com/

你可能感兴趣的文章
微服务架构的设计模式
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>
STL::deque以及由其实现的queue和stack
查看>>
WAV文件解析
查看>>
DAC输出音乐2-解决pu pu 声
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
WPF UI&控件免费开源库
查看>>
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
Ubuntu+win10远程桌面
查看>>
flutter-实现圆角带边框的view(android无效)
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>