设计模式19——行为型模式之备忘录模式

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

类型:对象行为型模式。

概述:

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

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

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

类图:

参与者:

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

示例代码:

using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern19
{
    class Warcrift
    {
        private string role;
        public string Role
        {
            get { return role; }
            set { role = value; }
        }
        public Memento CreateMemento()
        {
            return (new Memento(role));
        }
        public void SetMemento(Memento memento)
        {
            role = memento.Role;
        }
        public void Start()
        {
            Console.WriteLine("There is a " + role);
        }
    }
    class Memento
    {
        private string role;
        public Memento(string _role)
        {
            this.role = _role;
        }
        public string Role
        {
            get { return role; }
        }
    }
    class Caretaker
    {
        private Memento memento;
        public Memento Memento
        {
            get { return memento; }
            set { memento = value; }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            // 初始角色是英雄
            Warcrift war3 = new Warcrift();
            war3.Role = "Hero";
            war3.Start();
            Caretaker caretaker = new Caretaker();
            caretaker.Memento = war3.CreateMemento();
            // 更换角色为小兵
            war3.Role = "Soldier";
            war3.Start();
            // 退回到初始状态
            war3.SetMemento(caretaker.Memento);
            war3.Start();
        }
    }
}
适用性:
  1. 必须保存一个对象在某一个时刻(部分)状态这样以后需要它时才能恢复到先前的状态。
  1. 如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

优缺点:

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

参考资料:

  1. 《设计模式——可复用面向对象软件基础》
  1. 《大话设计模式》



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值