备忘录模式

原创 2016年06月02日 11:12:46

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

Created with Raphaël 2.1.0OriginatorOriginatorMementoMementoCaretakerCaretaker负责创建一个备忘录Memento,用以记录当前时刻的内部状态负责保存好备忘录Memento负责存储originator对象的内部状态,并且可以防止其以外的其他对象访问备忘录Memento

备忘录基本代码:
根据结构图可以简单分为三类:
发起人: Origiantor
备忘录: Memento
管理者: Caretaker

代码:

  //发起人
    public class Originator
    {
        public string State { get; set; }

        //创建备忘录,将当前需要保存的信息导入并实例化出一个Memento对象
        public Memento CreateMemento() 
        {
            return (new Memento(State));
        }
        //恢复备忘录,将Memento导入并将相关数据恢复
        public void SetMemento(Memento m) 
        {
            State = m.State;
        }
        //显示数据
        public void show() 
        {
            Console.WriteLine("State="+State);
        }
    }
    //备忘录
    public class Memento 
    {
        private string state;

        public string State 
        {
            get 
            {
                return state;
            }
        }
        public Memento(string state) 
        {
            this.state = state;
        }
    }

    //管理者
    public class Caretaker 
    {
        public Memento memento { get; set; }
    }

在Main方法中调用:

  static void Main(string[] args)
        {
            Originator o = new Originator();
            o.State = "ON";
            o.show();

            //保存状态
            Caretaker c = new Caretaker();
            c.memento = o.CreateMemento();

            o.State = "Off";
            o.show();
            //恢复原始状态
            o.SetMemento(c.memento);
            o.show();

            Console.ReadLine();

        }

结果:
这里写图片描述

该模式的好处:把保存的细节给封装在了Memento中了,哪一天要是在更改保存的细节也不用影响客户端了
使用场合 :Memento模式比较适用于功能比较复杂,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性的一小部分时,Originator可以根据保存的Memento信息还原到前一个状态

使用备忘录可以把复杂的对象内部信息对其他的对象屏蔽起来

接下来,我们练习一道题:
大家平常在玩游戏的时候,都会在打Boss之前保存一下,以防失败后再重新来过。
分析: 既然是游戏,则会有 生命值 、攻击力、防御力、 还有打Boss的行为和保存状态的行为。

源码:

   //发起类
    public class GameRole
    {
        //生命力
        public int Vit { get; set; }
        //攻击力 
        public int Attack { get; set; }
        //防御力
        public int Defense { get; set; }

        //创建备忘录
        public GameMemento CreateMemento() 
        {
            return (new GameMemento(Vit,Attack,Defense));
        }
        //大战Boss
        public void Fight() 
        {
            Vit = 0;
            Attack = 0;
            Defense =0;
        }
        //恢复备忘录
        public void SetMemento(GameMemento m) 
        {
            this.Vit = m.Vit;
            this.Attack = m.Attack;
            this.Defense = m.Defense;
        }
        //展示
        public void Show() 
        {
            Console.WriteLine("当前生命力:{0}",Vit);
            Console.WriteLine("当前攻击力:{0}", Attack);
            Console.WriteLine("当前防御力:{0}", Defense);
        }
    }

    //游戏备录类
    public class GameMemento 
    {
        private int vit;
        private int att;
        private int def;

        public GameMemento(int vit,int att,int def) 
        {
            this.vit = vit;
            this.att = att;
            this.def = def;
        }

        public int Vit 
        {
            get { return vit; }
        }

        public int Attack 
        {
            get { return att; }
        }
        public int Defense 
        {
            get { return def; }
        }
    }

    //游戏管理者
    public class GameCaretaker 
    {
        public GameMemento gameMemento { get; set; }
    }

在Main方法中调用的情况:

  static void Main(string[] args)
        {
            GameRole g = new GameRole();
            g.Vit = 50;
            g.Attack = 70;
            g.Defense = 60;

            g.Show();
            //保存进度
            GameCaretaker gm = new GameCaretaker();
            gm.gameMemento = g.CreateMemento();
            //打Boss
            g.Fight();
            g.Show();
            //恢复之前状态
            g.SetMemento(gm.gameMemento);
            g.Show();
            Console.ReadLine();

        }

结果:
这里写图片描述

备忘录模式Demo

  • 2017年05月22日 15:27
  • 22.38MB
  • 下载

Memento(备忘录)设计模式

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

备忘录模式源码

  • 2015年03月20日 15:23
  • 65KB
  • 下载

Android备忘录模式简单Demo

  • 2016年02月21日 15:50
  • 1.22MB
  • 下载

撤销功能的实现——备忘录模式(三)

21.3 完整解决方案       为了实现撤销功能,Sunny公司开发人员决定使用备忘录模式来设计中国象棋软件,其基本结构如图21-4所示:       在图21-4中,Chessman充当...
  • csdn_ds
  • csdn_ds
  • 2017年12月04日 09:22
  • 15

Java设计模式-备忘录

  • 2015年01月25日 01:25
  • 11KB
  • 下载

李实名的现代生活之 备忘录模式

李实名的现代生活之 备忘录模式一、定义                在不破坏代码封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态二、优点  1、有时一些发起人对象的内部信息必须保存...
  • lajiooo
  • lajiooo
  • 2011年05月28日 09:32
  • 708

备忘录模式

  • 2015年11月13日 16:30
  • 843KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:备忘录模式
举报原因:
原因补充:

(最多只允许输入30个字)