设计模式之第17章-备忘录模式(Java实现)

好男人就是我,我就是曾小贤。最近陈赫和张子萱事件闹得那是一个沸沸扬扬。想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么。不知道你们可曾记得爱情公寓里的一个经典的桥段~每次关谷和唐悠悠吵架的时候,总是可以进行“存档”,先干其他的事情,而后有时间的时候再继续“读档”,这是多么好的一个技能啊,想想吧,每次吵架,存档后可以做其他事情进行冷静一下,然后读档的时候已经冷静好了,是不是会清醒很多呢,是不是就不会有那么多的误会无法解除了呢?在这个事件中,他们两位用到了接下来出场的“备忘录模式”。好了,接下来有请备忘录~(众人:鱼哥真是越来越啰嗦了啊。吐槽帝啊简直,不,还是一个吃货。)

备忘录模式之自我介绍

鄙人不才,提供了一个不存在于真实世界的备忘录模式。说的通俗易懂一点就是传说中的“后悔药”。想想吧,当你做错什么事情的时候,只需“读档”到做错事之前就可以再来一遍,那是多少人心中所想,或者当你由于某些原因曾错过某些人某些事的时候,“读档”到这件事之前是多么令人心动。这样的话,有多少没有勇气去做的事情,会在有“后悔药”之后敢于一次又一次的尝试,在游戏中,敢于无数次的开荒、PK的人不正是因为无限的“复活”。好了,不再啰嗦,有关我的定义是:Without violating cncapsulation, capture and externalize an object's internal state so that the object can be restored to this state later.翻译过来就是说:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。说的直白一点,就是说将一个一个对象进行备份,提供了一种程序数据的备份方法,它的通用类图是:

备忘录模式之自我分析

分析未动,缺点先行:

首先来说,使用备忘录代价会比较高:如果原发器在生成备忘录时,必须拷贝并存储大量的信息,或者客户非常频繁地创建备忘录和恢复原发器状态,可能造成很大的开销。

在某些语言中难以保证只有原发器可访问备忘录的状态。

维护备忘录的潜在代价会比较高。由于管理器不知道备忘录中有多少个状态,因此存储备忘录时一个原本很小的管理器也可能产生大量的存储。

至于优点,列举如下:

保持封装边界。使用备忘录可以避免暴露一些只应由原发器管理却又必须存储在原发器之外的信息。

简化了原发器。由于把存储管理的重任交给了Originator,让客户管理它们请求的状态将会简化Originator,并且使得客户工作结束时无需通知原发器。

备忘录模式之实现

既然都说到了爱情公寓,那么就以爱情公寓的关谷来举个栗子。首先是关谷类,关谷类记录了关谷当时吵架的心情以及关谷在存档之后的变化:

1 public classGuanGu{2 //吵架时关谷的状态

3 private String state = "";4 //存档后的状态改变

5 public voidchangeState(){6 this.state = "心情变得冷静下来";7 }8

9 publicString getState(){10 returnstate;11 }12

13 public voidsetState(String state){14 this.state =state;15 }16

17 //保留备份

18 publicMemento createMemento(){19 return new Memento(this.state);20 }21 //恢复备份

22 public voidrestoreMemento(Memento memento){23 this.setState(memento.getState());24 }25 }

View Code

接下来就是比较重要的Memento类了,实现起来极其简单,非常纯粹的JavaBean:

1 public classMemento{2 //关谷的心情

3 private String state = "";4 //通过构造函数传递心情

5 publicMemento(String state){6 this.state =state;7 }8

9 publicString getState(){10 returnstate;11 }12

13 public voidsetState(String state){14 this.state =state;15 }16 }

最后就是备忘录的管理员角色,用来对备忘录进行管理、保存和提供备忘录。备忘录的管理员类也很简单:

1 public classCaretaker{2 //备忘录对象

3 privateMemento memento;4 publicMemento getMemento(){5 returnmemento;6 }7 public voidsetMemento(Memento memento){8 this.memento =memento;9 }10 }

至此,备忘录模式就实现了。

备忘录模式之应用场景

那么问题来了,什么时候才能使用备忘录模式呢:

需要保存和恢复数据的相关状态场景。

提供一个可回滚的操作,比如说各种编辑器中的Ctrl+Z组合键。

需要监控的副本场景中。

数据库连接的事务管理就是用的备忘录模式。

以上。预知后式如何,且听下回分解。

PS:本博客欢迎转发,但请注明博客地址及作者~

java实现备忘录模式_设计模式之第17章-备忘录模式(Java实现)相关推荐

  1. 米线店结账程序 装饰着模式_设计模式(三)装饰者模式

    装饰者模式是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.装饰者模式动态地将责任附加到对象身上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案,比生成子类更加灵活. 通常在继承关系 ...

  2. 第 17 章 命令模式

    第 17 章 命令模式 1.智能生活项目需求 我们买了一套智能家电, 有照明灯. 风扇. 冰箱. 洗衣机, 我们只要在手机上安装 app 就可以控制对这些家电工作. 这些智能家电来自不同的厂家, 我们 ...

  3. java桥接和装饰_设计模式:桥接模式和装饰模式

    原标题:设计模式:桥接模式和装饰模式 一.桥接模式简介 1.基础描述 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是&qu ...

  4. java设计与模式_设计模式《JAVA与模式》之状态模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述状态(State)模式的: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为 ...

  5. java mediator模式_设计模式之中介者模式(mediator模式)

    引入中介者模式 中介者模式实例 中介者模式分析 引入中介者模式 大家想象一下有十个人要共同完成一个工作,他们要互相合作和沟通,并且根据对方的通知可能要改变自己的状态,但这通常会带来很多问题,流程过于复 ...

  6. 创建型模式、结构型模式和行为型模式_设计模式之创建型模式

    设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...

  7. Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)

    从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析. 创建型模式(5种):用于描述"怎样创建对象",它的主要特点是& ...

  8. 设计模式 原型模式_设计模式:原型

    设计模式 原型模式 创新设计模式之一是原型设计模式 . 尽管原型是创造模式,但它在概念上与其他模式有所区别. 我的意思是原型在某种意义上创造了自己. 我将在下面解释. 原型模式的所有魔力都基于Java ...

  9. python实现模式_设计模式-python实现

    设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情 ...

最新文章

  1. 数字图像处理- 3.6 锐化空间滤波器
  2. Cadvisor源码分析监控项
  3. Spring MVC中使用Swagger生成API文档和完整项目示例Demo,swagger-server-api(二十)
  4. Java 性能优化实战记录(1)---定位并分析耗cpu最多的线程
  5. 我所理解cocos2d-x 3.6 lua --使用Cocos Studio
  6. maven The method must override a superclass method
  7. ADN新开了云计算Cloud和移动计算Mobile相关技术的博客
  8. Jdbc创建表 利用循环添加数据 ,更新数据
  9. Django的视图层
  10. 蚁群算法matlab vrp问题车辆限重,蚁群算法MATLAB解VRP问题
  11. spingboot整合netty实现单聊整合实现
  12. matplotlib绘制平滑曲线
  13. springboot配置文件加载顺序_「SpringBoot系列」配置文件加载优先级解析
  14. 雷士灯wifi控制方法_一种wifi无线控制的灯具系统的制作方法
  15. 率辉考研oj——1323: 算法2-1:集合union
  16. spark学习9:sparkStreaming
  17. Unity 生成随机房间、洞穴(2D、3D地图)总结
  18. matlab矩阵求逆的模块,matlab矩阵求逆矩阵
  19. 线性方程组的直接解法
  20. c语言课程设计作业五子棋,c语言课程设计案例-五子棋.ppt

热门文章

  1. Matlab实现WAV音频文件计算声品质参数:dBA、响度、粗糙度、尖锐度、波动度
  2. 【Chaos Mesh官方文档】Quick Start
  3. javascript字符串代码在前端的美化、格式化展示处理
  4. JAVA计算机毕业设计信贷管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  5. 华为 OD 帮你收集全信息 | 2023 年 6 月信息整理
  6. 计算机类中文核心期刊目录--搞科研发文章参考
  7. 8月B站UP主涨粉排行榜周榜发布,前三名: M木糖M、云视听小电视—TV、AS极客
  8. pycharm2019界面的中文设置,有汉化包、有详细步骤、有图片
  9. Android做一个透明的Activity,设置Activity背景为透明style
  10. Java基础编程小案例-买飞机票