摘要:本文用一个实例场景描述Gof 23设计模式中的备忘录(Memento)模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型。
关键字:Gof 23 设计模式 备忘录模式 Quarkus

1 基础知识
1.1 标准定义
备忘录(Memento)模式标准定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
1.2 分析和说明
备忘录(Memento)模式属于对象行为型模式。备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。
Memento结构如图1所示,其角色包括发起人(Originator)角色和负责人(Caretaker)角色。
图1 备忘录模式结构
 发起人(Originator)角色,发起人角色有如下的责任:① 创建一个含有当前的内部状态的备记录对象。② 使用备忘录对象存储其内部状态。
 负责人(Caretaker)角色,负责人角色有如下的责任:① 负责保存备忘录对象。② 不检查备忘录对象的内容。

2 应用场景举例
公司领导在每周周一都要召开项目会议,每次会议后都有会议纪要。会议纪要都要把现阶段项目情况汇总起来。这些项目情况就是备忘录,上面有时间戳这个标志。实现用例见图2所示。
图2 备忘录模式用例图
在这里可以把Meeting类理解为发起人(Originator)角色。Caretaker类是负责人(Caretaker)角色。其实现类图如图3所示。Memento类与Caretaker类的关系是聚合关系,即Caretaker类拥有多个Memento类。
图3 备忘录模式类图
备忘录模式实现顺序图见图4,实现顺序描述:① 基于Meeting类创建一个meet1对象;② 调用meet1对象的createMemento方法创建memento对象;③ 基于Caretaker类创建一个caretaker对象;④ 调用caretaker对象的saveMemento方法,把memento对象存入caretaker对象。
图4 备忘录模式实现顺序图

3.Quarkus的实现程序代码
Quarkus程序实现主要包括Meeting类文件,Caretaker类文件和Memento类文件等3个文件。其关系如图3所示。下面分别列出这3个文件的程序代码,最后列出测试代码并显示输出结果。
Meeting类程序代码清单01所示。
程序代码清单01

@Dependent
public class Meeting {private String meetName;private String meetType;private String meetdate;private String meetLeader;private String meetParticipants;private String decide;private String meetContent;public Meeting(){}public String getMeetName() {return meetName;}public void setMeetName(String meetName) {this.meetName = meetName;}public String getMeetType() {return meetType;}public void setMeetType(String meetType) {this.meetType = meetType;}public String getMeetdate() {return meetdate;}public void setMeetdate(String meetdate) {this.meetdate = meetdate;}public String getMeetLeader() {return meetLeader;}public void setMeetLeader(String meetLeader) {this.meetLeader = meetLeader;}public String getMeetParticipants() {return meetParticipants;}public void setMeetParticipants(String meetParticipants) {this.meetParticipants = meetParticipants;}public String getDecide() {return decide;}public void setDecide(String decide) {this.decide = decide;}public String getMeetContent() {return meetContent;}public void setMeetContent(String meetContent) {this.meetContent = meetContent;}public void doDecide() {meetContent = "会议名称:" + meetName + ";";meetContent = meetContent + "会议类型:" + meetType + ";";meetContent = meetContent + "会议时间:" + meetdate + ";";meetContent = meetContent + "会议主持人:" + meetLeader + ";";meetContent = meetContent + "会议参加者:" + meetParticipants + "\r";meetContent = meetContent + "会议内容:" + meetParticipants + ";";}public Memento CreateMemento() {Memento mo = new Memento(meetName, meetType, meetdate, meetLeader,meetParticipants, decide, meetContent);return mo;}public void recoveryMemento(Memento mo){meetName = mo.getMeetName();meetType = mo.getMeetType();meetdate = mo.getMeetdate();meetLeader = mo.getMeetLeader();meetParticipants = mo.getMeetParticipants();decide = mo.getDecide();meetContent = mo.getMeetContent();}public void showContent(){System.out.println(meetContent);}
}

Caretaker类程序代码清单02所示。
程序代码清单02

@ApplicationScoped
public class Caretaker {private Map<String, Memento> meetMementoMap = new HashMap<String, Memento>();public Memento recoveryMemento(String meetdate) {return meetMementoMap.get(meetdate);     }public void saveMemento(String meetdate, Memento memento) {this.meetMementoMap.put(meetdate, memento);     }public void showContent(){System.out.println("显示全部的会议情况:");       String meetdate;String meetContent;Iterator<String> it = meetMementoMap.keySet().iterator();while (it.hasNext()){meetdate = it.next();  meetContent = meetMementoMap.get(meetdate).getMeetContent();System.out.print(meetdate+";"+meetContent);System.out.println();           }           }
}

Memento类程序代码清单03所示。
程序代码清单03

public class Memento {   private String meetName;private String meetType;private String meetdate;private String  meetLeader;private String  meetParticipants;private String decide;private String  meetContent;public Memento(String meetName, String meetType, String meetdate,String meetLeader,
String meetParticipants, String decide,String meetContent) {super();this.meetName = meetName;this.meetType = meetType;this.meetdate = meetdate;this.meetLeader = meetLeader;this.meetParticipants = meetParticipants;this.decide = decide;this.meetContent = meetContent;}public void showContent(){System.out.println(meetContent);}public String getMeetName() {return meetName;   }public void setMeetName(String meetName) {this.meetName = meetName;   }public String getMeetType() {return meetType;}public void setMeetType(String meetType) {   this.meetType = meetType;}public String getMeetdate() {    return meetdate;}public void setMeetdate(String meetdate) {this.meetdate = meetdate;}public String getMeetLeader() {return meetLeader;}public void setMeetLeader(String meetLeader) {this.meetLeader = meetLeader;    }public String getMeetParticipants() {return meetParticipants;}public void setMeetParticipants(String meetParticipants) {this.meetParticipants = meetParticipants; }public String getDecide() {return decide;}public void setDecide(String decide) {this.decide = decide; }public String getMeetContent() {return meetContent;}public void setMeetContent(String meetContent) {this.meetContent = meetContent;   }
}

备忘录模式测试程序的代码清单04如下:
程序代码清单04

public class MementoClient implements QuarkusApplication {@ConfigProperty(name = "gof23.behavioralpattern.memento.title", defaultValue = "gof23")String title;@Inject    Meeting meet1,meet2 ;@Inject   Caretaker caretaker;@Overridepublic int run(String... args) {System.out.println("——————" + title + "演示输出———————");   meet1.setMeetName("meetName1");meet1.setMeetType("meetType1");meet1.setMeetdate("2009-01-01");meet1.setMeetLeader("meetLeader1");meet1.setMeetParticipants("meetParticipants1");meet1.setDecide("decide1");     meet1.doDecide();       Memento memento = meet1.CreateMemento();       caretaker.saveMemento(memento.getMeetdate(),memento);meet2.setMeetName("meetName2");meet2.setMeetType("meetType2");meet2.setMeetdate("2009-02-01");meet2.setMeetLeader("meetLeader2");meet2.setMeetParticipants("meetParticipants2");meet2.setDecide("decide2");        meet2.doDecide();       memento = meet2.CreateMemento();caretaker.saveMemento(memento.getMeetdate(),memento);      caretaker.showContent();        return 0;}public static void main(String... args) {Quarkus.run(MementoClient.class, args);}
}

备忘录模式测试类输出结果如下所示:

显示全部的会议情况:
2009-01-01;会议名称:meetName1;> 会议类型:meetType1;> 会议时间:2009-01-01;会议主持人:meetLeader1;会议参加者:meetParticipants1>
会议内容:meetParticipants1;
2009-02-01;会议名称:meetName2;会议类型:meetType2;会议时间:2009-02-01;会议主持人:meetLeader2;会议参加者:meetParticipants2
会议内容:meetParticipants2;

4. 相关Quarkus程序源码下载
可以直接从github上获取代码,读者可以从github上clone预先准备好的示例代码。

git clone https://github.com/rengang66/quarkus-sample-gof23.git

这是一个Maven项目,然后Maven导入工程。该程序位于“src\main\java\com\iiit\quarkus\sample\gof23\behavioralpattern\memento”目录中。
同时也可以从gitee上clone预先准备好的示例代码,命令如下:

git clone https://gitee.com/rengang66/quarkus-sample-gof23.git

参考文献

[1] E.Gamma, R.Helm, R.Johnson, and Vlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley, 1995
[2] E.Gamma, R.Helm, R.Johnson, and Vlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.2000.9.
[3] 阎宏,Java与模式,北京:电子工业出版社. 2002.10
[4] 王俊峰 戚晓滨. 设计模式和UML. 计算机应用研究,1999.16(5), 27-29,39.
[5] 陈琴 朱正强. UML在设计模式描述中的应用. 计算机工程与设计,2003.24(4), 81-84.
[6] 刘红军. J2ME手机日记本的设计原理与关键技术. 电脑编程技巧与维护,2008.(10), 43-46.
[7] 张昊 王彦桂 唐去克. 监控绘图软件中Undo/Redo的设计和实现. 自动化与信息工程,2008.29(1), 23-25.
[8] 韩小俊 王珂. 矢量图软件中Undo/Redo操作. 电脑编程技巧与维护,2007.(3), 63-65.
[9] 曾志明[1,2] 朱江[1,2] 张立立[1,2] 钟耳顺[1]. 设计模式在可复用GIS软件开发中的应用. 计算机工程,2006.32(7), 67-68,77.
[10] Quarkus官网. https://quarkus.io/

19-备忘录模式Quarkus实现相关推荐

  1. 设计模式19——行为型模式之备忘录模式

     定义:备忘录模式(MementoPattern),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 类型:对象行为型模式. 概述 ...

  2. 设计模式——(19)备忘录模式

    1.定义 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态.它是一种对象行为型模式,其别名为Token. 备忘录模式的核心是备忘录类以 ...

  3. 设计模式之备忘录模式(Memento)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. 备忘录模式(Memento)

    一.备忘录模式介绍 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 例如: 1.office重新打开时的恢复功能. ...

  5. 温故知新(8)——备忘录模式

    概述 先从面向对象的三大特征之一封装说起.面向对象的封装简单点说就是把状态(数据)和行为(操作这些数据的方法)放到一起,构成一个单元,通常叫做类.一个对象的行为是事先确定好的(静态)一些脚本,如果对象 ...

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

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

  7. 【设计模式】—— 备忘录模式Memento

    前言:[模式总览]----------by xingoo 模式意图 这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复. 该模式还有跟多可以扩展的地方,比如可以记录多 ...

  8. java备忘录模式应用场景_Java描述设计模式(24):备忘录模式

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

  9. 备忘录模式--如果再回到从前

    备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态. 备忘录模式应用场景:Memento模式比较适用于功能比较复杂的,但 ...

  10. 15-责任链模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的责任链模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 责任链模式 Quarkus 1 基 ...

最新文章

  1. C++实用技巧(二)
  2. Flv网络播放器制作全攻略
  3. JsonObject的依赖
  4. cassandra可视化工具_耗时1个月整理!160种Python标准库、第三方库和外部工具都有了...
  5. 8个球放入3个盒子方式_颜值与美味并存~分享几款私房盒子蛋糕做法,再也不用排队买了...
  6. jquery一个元素绑定了多个 click 事件,如何取消其中的一个
  7. 如何使用pattern recognition letter 的word写作模板
  8. 摸鱼摸累了,看几个有趣的网站
  9. 利用PS批量添加文件名到图片中
  10. Android 三类框架的理解以及MVVM框架的使用
  11. 最优化方法 19:近似梯度下降
  12. H.265编码视频播放器在播放FLV视频流时出现黑屏,如何解决?
  13. 汽修第5天 升降玻璃的维修
  14. 嵌入式主板的应用领域
  15. 学网页平面UI设计,我选择广州传智播客
  16. POJ2228 Naptime 【例题精讲】
  17. 计算机职称考试入户,揭秘!2020年考什么职称更容易入户广州?
  18. 论文排版图片一栏设置与文献引用的超链接设置-论文投稿经验总结-第3期
  19. cocos2d - 粒子系统工具(Particle Designer)
  20. [交换生申请之后](http://simplemind.info/blog/?p=413)

热门文章

  1. 华为服务器安装nas系统,云服务器搭建nas
  2. 全球资本市场竞争力指数排名发布,中国跃居第五
  3. 内存中的存储空间(栈空间、堆空间、数据段、代码段)
  4. 关于什么是AndroidX(一)
  5. 在家用群晖搭建wordpress博客
  6. BS 476-31 与BS 476-33 测试方法是类似的吗?
  7. Android实现微信查看附近的人
  8. 宇宙机器人超级计算机,宇宙机器人无线控制器使用指南白金攻略
  9. Tomb Raider(暴力模拟)
  10. 如何区分精确率(precision)、准确率(accuracy)和召回率(recall)