备忘录模式

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

将要保存的细节封装在Memento中,哪天要更改保存的细节也不影响客户端。
Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分。Originator可以根据保存的Memento信息还原到前一个状态。如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。有时一些对象的内部信息必须保存在对象意外的地方,但是必须要由对象自己来读取,这时,使用备忘录模式可以把复杂的对象内部信息对其他的对象屏蔽起来,从而可以恰当的保持封装的边界。

    //发起人类
    class Origninator
    {
        public string state { get; set; }//需要保存的属性,可能是多个。

        public Memento CreateMemento()//创建备忘录,将当前需要保存的信息导入并实例化出一个Memento对象。
        {
            return (new Memento(state));
        }
        public void SetMemento(Memento memento)
        {
            state = memento.State;//恢复备忘录,将Memento导入将相关数据恢复。
        }
        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
    {
        public Memento memento{ get; set; }//得到或设置备忘录

    }

        static void Main(string[] args)
        {
            Origninator o = new Origninator();//Orignator初始状态,状态为"On"。
            o.state = "On";
            o.Show();

            Caretaker c = new Caretaker();//保存状态时,由于有了很好的封装,可以隐藏Orignator的实现细节。
            c.memento = o.CreateMemento();

            o.state = "Off";//Orignator改变了状态属性为"Off"。
            o.Show();

            o.SetMemento(c.memento);//恢复初始状态。
            o.Show();

        }
原文地址:https://www.cnblogs.com/vichin/p/11804896.html