关闭

备忘录模式

标签: 设计模式
134人阅读 评论(0) 收藏 举报
分类:

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

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();

        }

结果:
这里写图片描述

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4998次
    • 积分:391
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:8篇
    • 译文:0篇
    • 评论:1条
    最新评论