zoukankan      html  css  js  c++  java
  • 备忘录模式

    备忘录模式的定义

    备忘录模式(Memento Pattern)提供了一种弥补真实世界缺陷的方法,让“后悔药”在程

    序的世界中真实可行,其定义如下:

    Without violating encapsulation,capture and externalize an object's internal state so that the

    object can be restored to this state later.(在不破坏封装性的前提下,捕获一个对象的内部状

    态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。)

    通俗地说,备忘录模式就是一个对象的备份模式,提供了一种程序数据的备份方法

    ● Originator发起人角色

    记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录

    数据。

    ● Memento备忘录角色

    负责存储Originator发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。

    ● Caretaker备忘录管理员角色

    对备忘录进行管理、保存和提供备忘录。

    发起人角色

    public class Originator {

         //内部状态

         private String state = "";

         

         public String getState() {

                 return state;

         }

         public void setState(String state) {

                 this.state = state;

         }

         //创建一个备忘录

         public Memento createMemento(){

                 return new Memento(this.state);

         }

         //恢复一个备忘录

         public void restoreMemento(Memento _memento){

                 this.setState(_memento.getState());

         }

    }

    备忘录角色

    public class Memento {

         //发起人的内部状态

         private String state = "";

         //构造函数传递参数

         public Memento(String _state){

                 this.state = _state;

         }

         public String getState() {

                 return state;

         }

         public void setState(String state) {

                 this.state = state;

         }

    }

    备忘录管理员角色

    public class Caretaker {

         //备忘录对象

         private Memento memento;

         public Memento getMemento() {

                 return memento;

         }

         public void setMemento(Memento memento) {

                 this.memento = memento;

         }

    }

    场景类

    public class Client {

         public static void main(String[] args) {

                 //定义出发起人

                 Originator originator = new Originator();

                 //定义出备忘录管理员

                 Caretaker caretaker = new Caretaker();

                 //创建一个备忘录

                 caretaker.setMemento(originator.createMemento());

                 //恢复一个备忘录

                 originator.restoreMemento(caretaker.getMemento());

         }

    }

    备忘录模式的使用场景

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

    ● 提供一个可回滚(rollback)的操作;比如Word中的CTRL+Z组合键,IE浏览器中的后

    退按钮,文件管理器上的backspace键等。

    ● 需要监控的副本场景中。

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

    备忘录模式的注意事项

    ● 备忘录的生命期

    备忘录创建出来就要在“最近”的代码中使用,要主动管理它的生命周期,建立就要使

    用,不使用就要立刻删除其引用,等待垃圾回收器对它的回收处理。

    ● 备忘录的性能

    不要在频繁建立备份的场景中使用备忘录模式(比如一个for循环中),原因有二:一是

    控制不了备忘录建立的对象数量;二是大对象的建立是要消耗资源的,系统的性能需要考

    虑。

  • 相关阅读:
    [BZOJ 3270] 博物馆
    [BZOJ 3551] Peaks加强版
    [HNOI 2009] 梦幻布丁
    [NOI 2018] 归程
    [YNOI 2016] 掉进兔子洞
    [SCOI 2014] 方伯伯的玉米田
    Codeforces Round #545 (Div. 2)
    初涉Min-Max容斥【在更】
    【费用流】bzoj1834: [ZJOI2010]network 网络扩容
    【最大权闭合子图】bzoj4873: [Shoi2017]寿司餐厅
  • 原文地址:https://www.cnblogs.com/future-zmy/p/6298539.html
Copyright © 2011-2022 走看看