首页 > 设计模式 > 初尝Memento 模式

初尝Memento 模式

在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。

如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。

意图

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

结构图

Memento结构图 初尝Memento 模式

其实结构图中Caretaker 不一定必须实现,不难发现的是,他是对“备忘录”中保存的状态的起到一种暂存的作用。下面是一段代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Memento
{
    class Program
    {
        static void Main(string[] args)
        {
            Person A = new Person("A");
            Person B = new Person("B");
            Person C = new Person("C");

            HRSystem hr = new HRSystem();
            hr.Add(A);
            hr.Add(B);
            Memento m = hr.CreatMemento();
            hr.Add(C);
            Console.WriteLine("After added C, we have :");
            hr.ShowInfo();
            Console.WriteLine("But, I've made a mistake...So:");
            hr.RecoverToMemento(m);
            hr.ShowInfo();
        }
    }
    [Serializable]
    class Person {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public Person(string name) {
            this.name = name;
        }
    }
    [Serializable]
    class HRSystem {
        List list = new List();

        public void ShowInfo() {
            Console.WriteLine("-----------------");
            foreach (Person p in list) {
                Console.WriteLine("{0} is available .",p.Name);
            }
            Console.WriteLine("-----------------");
        }

        public void Add(Person p) {
            if (list != null && !list.Contains(p)) {
                list.Add(p);
                Console.WriteLine("{0} has been added!", p.Name);
            }
        }

        public void Remove(Person p) {
            if (list != null && list.Contains(p)) {
                Console.WriteLine("{0} has been removed!",p.Name);
            }

        }

        public void SetHRList(HRSystem hr) {
            this.list = hr.list;
        }

        public Memento CreatMemento() {
            Console.WriteLine("Now ,Saving State above ↑...");
            return new Memento().SetMemento(this);
        }

        public void RecoverToMemento(Memento m) {
            Console.WriteLine("Recovering To Memento...");
            HRSystem hr = (HRSystem)m.GetMemento();
            this.SetHRList(hr);
        }

    }

    class Memento {
        MemoryStream ms = new MemoryStream();
        BinaryFormatter bf = new BinaryFormatter();
        public Memento SetMemento(object obj) {
            bf.Serialize(ms,obj);
            return this;
        }

        public object GetMemento() {
            ms.Seek(0,SeekOrigin.Begin);
            return bf.Deserialize(ms);
        }

    }

}

运行截图

Memento运行结果 初尝Memento 模式

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.