zoukankan      html  css  js  c++  java
  • 设计模式19——行为型模式之备忘录模式

     定义:备忘录模式(MementoPattern),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

    类型:对象行为型模式。

    概述:

              备忘录模式使用的范围比较窄,即比较复杂的状态需要恢复到之前的状态。现实更多的情况只有很简单的状态需要恢复,如果用备忘录模式有点大材小用的感觉。就像用大炮打蚊子,起不到什么作用。在《Head First Design Patterns》,备忘录模式也被列为不常用的模式之一。

             备忘录模式相对比较简单,即把一个有着复杂状态且需要恢复Originator的对象中的一些需要被保存的状态再次抽象出来,并提供一些操作接口封装成一个Memento类。这样将极大简化Originator类的复杂性。Memento的接口因为是操作状态的,所以不应该开放给更多的人知道,所以这里又继续封装了一个管理Memento类的Caretaker类,并提供一些简单对外的接口。

            恢复状态,其实玩过单机剧情类游戏的人都会马上想到“存档”这个功能。“存档”功能在某种意义上就是备忘录的一种应用。这里即以我最喜欢的游戏Warcraft III为示例。

    类图:

    参与者:

    1. Warcraft,也即Originator,它的状态需要被记录以及恢复。
    1. Memento,抽象出Warcraft的内部状态,并提供操作方法。
    1. Caretaker,管理Memento,并向外提供记录及恢复状态的方法,但是不了解具体的执行过程。

    示例代码:

    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Text;  
    4. namespace Pattern19  
    5. {  
    6.     class Warcrift  
    7.     {  
    8.         private string role;  
    9.         public string Role  
    10.         {  
    11.             get { return role; }  
    12.             set { role = value; }  
    13.         }  
    14.         public Memento CreateMemento()  
    15.         {  
    16.             return (new Memento(role));  
    17.         }  
    18.         public void SetMemento(Memento memento)  
    19.         {  
    20.             role = memento.Role;  
    21.         }  
    22.         public void Start()  
    23.         {  
    24.             Console.WriteLine("There is a " + role);  
    25.         }  
    26.     }  
    27.     class Memento  
    28.     {  
    29.         private string role;  
    30.         public Memento(string _role)  
    31.         {  
    32.             this.role = _role;  
    33.         }  
    34.         public string Role  
    35.         {  
    36.             get { return role; }  
    37.         }  
    38.     }  
    39.     class Caretaker  
    40.     {  
    41.         private Memento memento;  
    42.         public Memento Memento  
    43.         {  
    44.             get { return memento; }  
    45.             set { memento = value; }  
    46.         }  
    47.     }  
    48.     class Program  
    49.     {  
    50.         static void Main(string[] args)  
    51.         {  
    52.             // 初始角色是英雄  
    53.             Warcrift war3 = new Warcrift();  
    54.             war3.Role = "Hero";  
    55.             war3.Start();  
    56.             Caretaker caretaker = new Caretaker();  
    57.             caretaker.Memento = war3.CreateMemento();  
    58.             // 更换角色为小兵  
    59.             war3.Role = "Soldier";  
    60.             war3.Start();  
    61.             // 退回到初始状态  
    62.             war3.SetMemento(caretaker.Memento);  
    63.             war3.Start();  
    64.         }  
    65.     }  
    66. }  


    适用性:

    1. 必须保存一个对象在某一个时刻(部分)状态这样以后需要它时才能恢复到先前的状态。
    1. 如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

    优缺点:

    1. 优点,降低对象之间的耦合度,还降低管理对象的复杂度。
    1. 缺点,如果需要存储的信息非常多,将会赞成非常大的开销。

    参考资料:

    1. 《设计模式——可复用面向对象软件基础》
      1. 《大话设计模式》
  • 相关阅读:
    操作正则表达式的公共类
    验证码类
    强制转化常用函数
    实现Base64编码与其它编码转换的类
    关于任务管理器踩过的坑,程序员必看!
    每次找Internet选项感到抓狂?一键打开!
    教你避过安装TensorFlow的两个坑
    HTML中id与name的通俗区别
    VS code代码对齐快捷键
    form和table的区别
  • 原文地址:https://www.cnblogs.com/feihe0755/p/3588519.html
Copyright © 2011-2022 走看看