一、概述

  概念

  

  UML简图

  

  角色

  根据下图得到角色

  

  备忘录角色(Memento)、发起人角色(Originator)、负责人角色(Caretaker)

二、实践

  使用白箱实现,给出角色的代码:

  发起人

  1. /**
  2. * 发起者
  3. *
  4. * @author Administrator
  5. **/
  6. public class Originator {
  7. /**
  8. * 发起者想要保存的状态
  9. */
  10. private String state;
  11.  
  12. public String getState() {
  13. return state;
  14. }
  15.  
  16. public void setState(String state) {
  17. this.state = state;
  18. }
  19.  
  20. /**
  21. * 返回备忘录角色的工厂方法
  22. * @return 备忘录角色
  23. */
  24. public Memento createMemento() {
  25. return new Memento(state);
  26. }
  27. public void restoreMemento(Memento m) {
  28. this.state = m.getState();
  29. }
  30. }

  备忘录

  1. /**
  2. * 备忘录角色
  3. *
  4. * @author Administrator
  5. **/
  6. public class Memento {
  7. private String state;
  8.  
  9. public String getState() {
  10. return state;
  11. }
  12.  
  13. public void setState(String state) {
  14. this.state = state;
  15. }
  16.  
  17. public Memento(String state) {
  18. this.state = state;
  19. }
  20. }

  负责人

  1. /**
  2. * 负责人
  3. *
  4. * @author Administrator
  5. **/
  6. public class Caretaker {
  7. private Memento memento;
  8.  
  9. public Memento getMemento() {
  10. return memento;
  11. }
  12.  
  13. public void setMemento(Memento memento) {
  14. this.memento = memento;
  15. }
  16. }

  客户端

  1. /**
  2. * 客户端
  3. * @author Administrator
  4. **/
  5. public class Client {
  6. private static Originator originator = new Originator();
  7. private static Caretaker caretaker = new Caretaker();
  8. public static void main(String[] args) {
  9. // 改变发起人状态
  10. originator.setState("new");
  11. // 创建备忘录并由负责人保存
  12. caretaker.setMemento(originator.createMemento());
  13. // 修改发起人状态
  14. originator.setState("show");
  15. System.out.println(originator.getState());
  16. // 恢复状态
  17. originator.restoreMemento(caretaker.getMemento());
  18. System.out.println(originator.getState());
  19. }
  20. }

三、改进与思考

  这里就不再展开黑箱实现了,给出《Java与模式》中的实现方案

  

  一些实际运用

  例如WEB运用中输入表单的时候可以通过备忘录模式进行一些表单数据的回显。

Java设计模式(21)——行为模式之备忘录模式(Memento)的更多相关文章

  1. java设计模式-----21、备忘录模式

    概念: Memento模式也叫备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式,它的作用是保存对象的内部状态,并在需要的时候(u ...

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

    设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...

  3. Java设计模式(14)责任链模式(Chain of Responsibility模式)

    Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...

  4. Java设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J设计模式之五大创建型 ...

  5. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  6. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  7. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  8. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  9. Java设计模式(十一) 享元模式

    原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...

  10. Java 设计模式系列(二三)访问者模式(Vistor)

    Java 设计模式系列(二三)访问者模式(Vistor) 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以 ...

随机推荐

  1. 039条件变量同步(Condition)

    也是锁,这个锁多加了wait(),notify()唤醒一个进程,notifyall()唤醒全部进程方法,创建的时候默认是Rlock类型的锁,可以设置为lock类型的,默认就ok from random ...

  2. Codeforces Round #436 (Div. 2)【A、B、C、D、E】

    Codeforces Round #436 (Div. 2) 敲出一身冷汗...感觉自己宛如智障:( codeforces 864 A. Fair Game[水] 题意:已知n为偶数,有n张卡片,每张 ...

  3. bzoj4600 [Sdoi2016]硬币游戏

    Description Alice和Bob现在在玩的游戏,主角是依次编号为1到n的n枚硬币.每一枚硬币都有两面,我们分别称之为正面和反面.一开始的时候,有些硬币是正面向上的,有些是反面朝上的.Alic ...

  4. C#利用NPOI处理excel的类 NPOIHelper.cs

    个人的NPOIHelp类,包括datatable导出到excel,dataset导出到excel,excel导入到datatable,excel导入到dataset, 更新excel中的数据,验证导入 ...

  5. Mac常备必用的软件-mac软件推荐

    目录 终端工具 iTerm2,做开发的都用它代替系统自带的“终端”,免费软件,官网直接下载即可. 文件比较工具 meld,开源免费的文件/文本比较工具. 安装方法:brew cask install ...

  6. PHP验证信用卡卡号函数

    /** * 验证银行卡号是否是信用卡 * @param $cardnumber * @return bool */ function validateCard ($cardnumber) { $car ...

  7. 如何解决“当前上下文中不存在名称“XXXXXXXX””的问题

    如果你是用的Visual Studio 2017,如果你项目中的.cshtml文件出现编译调试一切正常,但是在设计时查看出现下面的提示时: 错误 CS0103 当前上下文中不存在名称“ViewBag” ...

  8. 从源码看String,StringBuffer,StringBuilder的区别

    前言 看了一篇文章,大概是讲面试中的java基础的,有如题这么个面试题.我又翻了一些文章看了下,然后去看源码.看一下源码大概能更加了解一些. String String类是final的,表示不可被继承 ...

  9. iOS- CoreData 数据库管理利器!

    1.前文 上次用SQLite3实现了数据管理,这次准备用CoreData来实现. Core Data 是iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据.使用Core D ...

  10. 给出一个整数,将这个整数中每位上的数字进行反转(JavaScript编程)

    一.问题描述:给出一个整数,将这个整数中每位上的数字进行反转.示例:输入:123,输出321:输入-123,输出-321:输入120,输出-21 二.问题分析与解决: 需要将给出的整数反转,注意示例中 ...