>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 22687 个阅读者 刷新本主题
 * 贴子主题:  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对象持久化技术概述
  Java网络编程-->用Axis发布Web服务
  精通Spring-->绑定CSS样式
  Vue3开发-->Vue Router路由管理器
  快速理解 函数式编程,响应式编程,链式编程
  观察者模式和发布订阅模式的区别
  java.util.logging.Logger使用详解
  深入研究java.lang.ThreadLocal类
  java.util.logging.Logger使用详解
  java NIO示例以及流程详解
  Java多线程volatile详解
  Eclipse使用指南:Debug 配置
  Java设计模式:观察者模式
  Java设计模式:迭代器模式
  Java设计模式:解释器模式
  Java设计模式:组合模式
  5个非常有挑战性的Java面试题
  Java入门实用代码:获取链表(LinkedList)的第一个和最后一...
  中国有多少程序员?现在还值得学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前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。