专栏首页CSDN旧文『设计模式』备忘录模式(memento)下象棋,我就想悔棋怎么办

『设计模式』备忘录模式(memento)下象棋,我就想悔棋怎么办

Memento模式的关键就是要在不破坏封装性的前提下,捕获一个对象的内部状态并在该对象之外保存这个状态。这样以后就可以利用该保存的状态实施恢复操作。

模式结构

  • Originator(原发器) 创建一个备忘录,并存储它的当前内部状态,也可以使用备忘录来回复其内部状态。
  • Memento(备忘录) 储存原发器的内部状态,备忘录的设计一般可以参考原发器的设计,根据实际需要确定备忘录类中的属性。
  • Caretaker(负责人) 负责人又称为管理者,在负责人类中可以储存一个或多个备忘录对象,他只负责存储对象而不能修改独享,也无需知道对象的实现细节。

基本代码

class Originator
    {
        private string state;
        public string State
        {
            get { return state; }
            set { state = value; }
        }
        public Memento CreateMemento()
        {
            return (new Memento(state));
        }
        public void SetMemento(Memento menmento)
        {
            state = menmento.State;
        }
        public void Show()
        {
            Console.WriteLine("State=" + state);
        }
    }
    //备忘录类
    class Memento
    {
        private string state;
        public Memento(string state)
        {
            this.state = state;
        }
        public string State
        {
            get { return state; }
        }
    }
    //管理者类
    class Caretaker
    {
        private Memento memento;
        public Memento Memento
        {
            get { return memento; }
            set { memento = value; }
        }
    }
    class Program
    {
        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.Read();
        }
    }class="one-pan-link-mark">优点

 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取。这时,使用备忘录模式可以把复杂的发起入内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
缺点

 如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很大。当管理者角色将-一个备忘录存储起来的时候,管理者可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很大。
适用场合
如果必须保存一个对象在某一个时刻的全部或者部分状态,不方便在以后需要的时候,可以把该对象恢复到先前的状态,可以使用备忘录模式
本质
保存和恢复内部状态。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 『设计模式』电话接线员与中介者模式

    用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

    风骨散人Chiam
  • 『设计模式』撩妹秘籍竟是使用设计模式的抽象工厂模式

    如果存在一部撩妹的手机,加上一个后宫,请问你该怎么做? 砸了手机,跟老婆孩子好好过日子,本篇文章到此结束!

    风骨散人Chiam
  • [USACO1.5]回文质数 Prime Palindromes

    题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。

    风骨散人Chiam
  • 传统ERP的好日子真的没有了吗?

    一大早看得到一篇文章《[URL=http://news.cnblogs.com/n/131835/]传统ERP的好日子没有了?》[/URL],看到标题以为是说E...

    崔文远TroyCui
  • Java设计模式-责任链模式

    作者:Jet啟思 链接:https://juejin.im/post/5a126b146fb9a0450c490201 今天来说说程序员小猿和产品就关于需求发生...

    Java高级架构
  • Java 14 新特性之JEP 359: Records(Preview)

    本月(2020-03) Java 14 就该正式发布了,有一个 Java 社区呼唤已久的特性将作为 preview feature包含在 Java 14 中 ,...

    码农小胖哥
  • ERP软件与财务管理软件管理上有何区别点呢?

      众所周知,财务管理强调的是事后核算,实际发生原则是财务管理的首要原则,也就是说,它对于企业经营现状的反映具有滞后性,只能在一切都已经成为事实以后在采取补救措...

    明象ERP
  • 微信小程序模板消息详解

    先放代码 wxml: <form name='pushMsgFm' report-submit bindsubmit='orderSign'> <vi...

    李文杨
  • 如何利用ETW(Event Tracing for Windows)记录日志

    ETW是Event Tracing for Windows的简称,它是Windows提供的原生的事件跟踪日志系统。由于采用内核(Kernel)层面的缓冲和日志记...

    蒋金楠
  • 数据库事务总结

    SuperHeroes

扫码关注云+社区

领取腾讯云代金券