>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 22616 个阅读者 刷新本主题
 * 贴子主题:  Java设计模式:备忘录模式 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-01-30 19:04:15     消息  查看  搜索  好友  邮件  复制  引用

  

Java设计模式:备忘录模式

    备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。    

介绍

     意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

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

         何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。

         如何解决:通过一个备忘录类专门存储对象状态。

         关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。

         应用范例:

1、后悔药。

2、打游戏时的存档。

3、Windows 里的 ctri + z。

4、IE 中的后退。

4、数据库的事务管理。

      优点:

1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。

2、实现了信息的封装,使得用户不需要关心状态的保存细节。

      缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

      使用场景:

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

2、提供一个可回滚的操作。

      注意事项:

1、为了符合迪米特原则,还要增加一个管理备忘录的类。

2、为了节约内存,可使用原型模式+备忘录模式。      

实现

     备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。

     MementoPatternDemo,我们的演示类使用 CareTaker 和 Originator 对象来显示对象的状态恢复。

    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

步骤 1

     创建 Memento 类。    

Memento.java

public   class   Memento   {
    private   String   state ;

    public   Memento ( String   state ) {
       this . state  =  state ;
    }

    public   String   getState ( ) {
       return   state ;
    }  
}

步骤 2

     创建 Originator 类。    

Originator.java

public   class   Originator   {
    private   String   state ;

    public   void   setState ( String   state ) {
       this . state  =  state ;
    }

    public   String   getState ( ) {
       return   state ;
    }

    public   Memento   saveStateToMemento ( ) {
       return   new   Memento ( state ) ;
    }

    public   void   getStateFromMemento ( Memento   Memento ) {
       state  =  Memento . getState ( ) ;
    }
}

步骤 3

     创建 CareTaker 类。                      

CareTaker.java

import   java . util . ArrayList ;
import   java . util . List ;

public   class   CareTaker   {
    private   List < Memento >  mementoList  =  new   ArrayList < Memento > ( ) ;

    public   void   add ( Memento   state ) {
       mementoList . add ( state ) ;
    }

    public   Memento   get ( int   index ) {
       return   mementoList . get ( index ) ;
    }
}

步骤 4

     使用 CareTaker 和 Originator 对象。                      

MementoPatternDemo.java

public   class   MementoPatternDemo   {
    public   static   void   main ( String [ ]   args )   {
       Originator   originator  =  new   Originator ( ) ;
       CareTaker   careTaker  =  new   CareTaker ( ) ;
       originator . setState ( " State #1 " ) ;
       originator . setState ( " State #2 " ) ;
       careTaker . add ( originator . saveStateToMemento ( ) ) ;
       originator . setState ( " State #3 " ) ;
       careTaker . add ( originator . saveStateToMemento ( ) ) ;
       originator . setState ( " State #4 " ) ;

       System . out . println ( " Current State:  "  +  originator . getState ( ) ) ;    
       originator . getStateFromMemento ( careTaker . get ( 0 ) ) ;
       System . out . println ( " First saved State:  "  +  originator . getState ( ) ) ;
       originator . getStateFromMemento ( careTaker . get ( 1 ) ) ;
       System . out . println ( " Second saved State:  "  +  originator . getState ( ) ) ;
    }
}

步骤 5

     验证输出:

Current State: State #4

First saved State: State #2

Second saved State: State #3








程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-02-05 10:25:21 重新编辑]
  Java面向对象编程-->操作符
  JavaWeb开发-->自定义JSP标签(Ⅱ)
  JSP与Hibernate开发-->映射对象标识符
  Java网络编程-->用Spring整合CXF发布Web服务
  精通Spring-->绑定表单
  Vue3开发-->Vue Router路由管理器
  Java虚拟机安全性-class文件检验器
  Java内存设置详解(含内存溢出问题的解决)
  JDK自带JVM调优工具的用法
  Java Optional 解决空指针异常总结
  [讨论]书中多线程章节的图示有误?
  Java关键字final、static使用总结
  java.util.logging.Logger使用详解
  Java注解的定义和使用
  邀请您一起来祝福和祈祷,祈愿疫情早日消除,平安吉祥
  Java多线程volatile详解
  Java设计模式:享元模式
  Java 入门实用代码:从 List列表中 截取子列表
  Java入门实用代码: 集合中添加元素
  史上最全正则表达式合集(马上收藏)
  Eclipse中怎么一键去除java项目中的信息打印语句
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 patebeng4 
  
威望: 0
级别: 新手上路
魅力: 105
经验: 105
现金: 1008
发文章数: 1
注册时间: 0001-01-01
 消息  查看  搜索  好友  邮件  复制  引用


机场回应因托运太贵狗狗被就地遗弃离心泵
新西兰首发团26000元1分钟售罄上海螺杆泵39
任泽平:建议法定婚龄降到18岁上海离心泵20
中国女子买70万平无人岛在日引争议上海化工泵21
邻居扔偏炮仗致男童截肢上海磁力泵49
女子恋爱6年被分手报警讨说法化工泵49
茅台立春酒定价2899元离心泵54
新冠病毒去哪儿了?磁力泵
多国关闭驻土耳其领事馆 土总统警告螺杆泵
湖南高速多车相撞事故致16死66伤螺杆泵
广州“制衣村”再现招工潮磁力泵
男子油锅炸元宵现场惨烈化工泵
湖南一网凌晨变《狂飙》专场污泥螺杆泵

水泵
台湾佛光山星云大师圆寂全焊接球阀
湖南高速车祸亲历者:事发前突现白雾焊接球阀
压力给到彭于晏 直埋全焊接球阀
中俄边境绽放烟花:俄居民隔江观赏埋地全焊接球阀
警方回应男子领证7天被妻子打进医院Fully Welded Ball Valve112
解放军新MV发布 细节引台媒关注Welded Ball Valve124
发文章时间 2023-02-08 17:15:35
 IPIP: 已设置保密 1 楼     
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。