zoukankan      html  css  js  c++  java
  • 十一个行为模式之备忘录模式(Memento Pattern)

    定义:
    在不破坏原有封装的情况下,捕获一个对象的内部状态,并在对象之外保存。当对象出错或者无效是,可以根据该备忘录进行恢复。

    结构图:

    • Originator:原发类,被记录的对象,包含若干内部状态。一般定义了一个createMemento()方法用于生产一个备忘录,记录当前的状态。
    • Memento:备忘录类,类的结构和原发类相似,选择性地选取原发类的属性作为自己的属性,用于存储原发类的状态。该类有严格的访问控制,除了原发类和负责人类可以访问,备忘录不能提供给其它类使用。
    • Caretaker:负责人类,用于管理和存储备忘录。但是不能更改的内容进行操作和检验。

    注意:

    • 在设计备忘录类的时候,不累Originator类,不允许其它类调用备忘录类的构造函数,或者改变备忘录类的状态。再具体实现的时候,C++可以使用友元类来进行实现;Java可以使用内部类或者同一个包下来实现。
    • 在设计负责人类的时候,如果要实现多次撤销或者redo的操作,需要使用一个队列来存储按照时间的多个备忘录。通过对队列的正向和反向遍历来完成撤销或者redo操作。

    优点:

    • 提供了一种状态恢复机制,使得用户可以方便地回到历史的一个特定历史步骤。
    • 备忘录封装了类的当前状态,而不会被其它类改动。可以使用队列或者栈进行多次撤销操作。

    缺点:

    • 当原发类或者备忘录太多的时候严重浪费系统资源,每保存一个对象就要使用一定的内存空间。

    实例:
    MementoPattern.java

  • 相关阅读:
    LeetCode "Median of Two Sorted Arrays"
    LeetCode "Distinct Subsequences"
    LeetCode "Permutation Sequence"

    LeetCode "Linked List Cycle II"
    LeetCode "Best Time to Buy and Sell Stock III"
    LeetCode "4Sum"
    LeetCode "3Sum closest"
    LeetCode "3Sum"
    LeetCode "Container With Most Water"
  • 原文地址:https://www.cnblogs.com/zhangfei614/p/6083338.html
Copyright © 2011-2022 走看看