zoukankan      html  css  js  c++  java
  • 行为类模式(六):备忘录(Memento)

    定义

    在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

    UML

    优点

    1. 将被存储的状态放在外面,不要和关键对象混在一起,可以帮助维护内聚;
    2. 保持关键对象的数据封装;
    3. 提供了容易实现的恢复能力。

    缺点

    1. 储存和恢复状态的过程可能相当耗时。

    应用场景

    1. 备忘录模式用于存储状态,在java中可以使用序列化;
    2. 如果有需要提供回滚操作的需求,使用备忘录模式非常适合,比如jdbc的事务操作,文本编辑器的Ctrl+Z恢复等。

    示例

    使用备忘录模式备份和还原一个状态。

    Java

     1 public class Main
     2 {
     3     public static void main(String[] args)
     4     {
     5         Originator originator = new Originator();
     6         originator.setState("状态1");
     7         System.out.println("初始状态:" + originator.getState());
     8         Caretaker caretaker = new Caretaker();
     9         caretaker.setMemento(originator.createMemento());
    10         originator.setState("状态2");
    11         System.out.println("改变后状态:" + originator.getState());
    12         originator.restoreMemento(caretaker.getMemento());
    13         System.out.println("恢复后状态:" + originator.getState());
    14     }
    15 
    16     /**
    17      * 发起人类,该类的内部状态需要进行备份,并提供createMemento和restoreMemento两个方法来进行备份和恢复
    18      */
    19     public static class Originator
    20     {
    21         private String state = "";
    22 
    23         public String getState()
    24         {
    25             return state;
    26         }
    27 
    28         public void setState(String state)
    29         {
    30             this.state = state;
    31         }
    32 
    33         public Memento createMemento()
    34         {
    35             return new Memento(this.state);
    36         }
    37 
    38         public void restoreMemento(Memento memento)
    39         {
    40             this.setState(memento.getState());
    41         }
    42     }
    43 
    44     /**
    45      * 备忘录类,该类仅用来记录发起人的内部状态
    46      * 如果需要记录多份状态可以修改该类来进行支持
    47      */
    48     public static class Memento
    49     {
    50         private String state = "";
    51 
    52         public Memento(String state)
    53         {
    54             this.state = state;
    55         }
    56 
    57         public String getState()
    58         {
    59             return state;
    60         }
    61 
    62         public void setState(String state)
    63         {
    64             this.state = state;
    65         }
    66     }
    67 
    68     /**
    69      * 管理类,该类用来管理指定的发起人创建的备忘录类
    70      * 如果需要管理多个备忘录可以修改该类来进行支持
    71      */
    72     public static class Caretaker
    73     {
    74         private Memento memento;
    75 
    76         public Memento getMemento()
    77         {
    78             return memento;
    79         }
    80 
    81         public void setMemento(Memento memento)
    82         {
    83             this.memento = memento;
    84         }
    85     }
    86 }
    View Code
  • 相关阅读:
    HttpClient Coder Example
    HttpClient容易忽视的细节—连接关闭
    Hibernate中所有包作用详细讲解
    Commons-VFS 使用SFTP
    Ant 编译项目资源不足
    ActiveMQ介绍和ActiveMQ入门实例
    ActiveMQ与MSMQ的异同
    linux nohup命令详解
    linux sed命令详解
    linux iptables命令详解
  • 原文地址:https://www.cnblogs.com/hammerc/p/4743806.html
Copyright © 2011-2022 走看看