设计模式实践-备忘录模式

场景

备忘配置文件,实现配置文件的撤销和重做操作

实现代码

配置文件类型

namespace DesignPatterns.Memento
{
    /// <summary>
    ///     配置文件类型
    /// </summary>
    public class ServerConfig
    {
        /// <summary>
        ///     Gets or sets IP
        /// </summary>
        public string Ip { get; set; }

        /// <summary>
        ///     Gets or sets Port
        /// </summary>
        public uint Port { get; set; }

        /// <summary>
        /// 重写ToString函数
        /// </summary>
        /// <returns>输出字符串</returns>
        public override string ToString()
        {
            return string.Format($"Ip: {this.Ip}, Port: {this.Port}");
        }
    }
}

配置拥有者类

namespace DesignPatterns.Memento
{
    /// <summary>
    /// 需要做备忘的类
    /// </summary>
    public class Original
    {
        /// <summary>
        /// Gets or sets 服务器配置
        /// </summary>
        public ServerConfig ServerConfig { get; set; }

        /// <summary>
        /// 创建配置备忘
        /// </summary>
        /// <returns>配置备忘</returns>
        public ConfigMemento CreateMemento()
        {
            return new ConfigMemento(this.ServerConfig);
        }
    }
}

配置备忘类

namespace DesignPatterns.Memento
{
    /// <summary>
    /// 配置备忘
    /// </summary>
    public class ConfigMemento
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="ConfigMemento" /> class.
        /// </summary>
        /// <param name="serverConfig">配置文件对象</param>
        public ConfigMemento(ServerConfig serverConfig)
        {
            this.ServerConfig = serverConfig;
        }

        /// <summary>
        /// Gets or sets 配置文件
        /// </summary>
        public ServerConfig ServerConfig { get; set; }
    }
}

配置管理者

namespace DesignPatterns.Memento
{
    /// <summary>
    /// 配置残酷
    /// </summary>
    public class ConfigStorage
    {
        /// <summary>
        /// 配置列表
        /// </summary>
        private readonly List<ConfigMemento> _configMementoes = new List<ConfigMemento>();

        /// <summary>
        /// 当前索引
        /// </summary>
        private int _current = -1;

        /// <summary>
        /// 设置配置项
        /// </summary>
        /// <param name="config">配置备忘</param>
        public void SetMemento(ConfigMemento config)
        {
            this._current ++;
            this._configMementoes.Add(config);
        }

        /// <summary>
        /// 重做
        /// </summary>
        /// <returns>配置项</returns>
        public ConfigMemento Do()
        {
            if (this._configMementoes.Count < 0)
                return null;
            if (this._current < 0 || this._current >= (this._configMementoes.Count - 1)) return null;
            this._current ++;
            return this._configMementoes[this._current];
        }

        /// <summary>
        /// 撤销
        /// </summary>
        /// <returns>配置项</returns>
        public ConfigMemento Undo()
        {
            if (this._configMementoes.Count < 0)
                return null;
            if (this._current <= 0 || this._current > (this._configMementoes.Count - 1)) return null;
            this._current--;
            return this._configMementoes[this._current];
        }
    }
}

相关调用

Original original = new Original();
original.ServerConfig = new ServerConfig
{
    Ip = "192.168.1.1",
    Port = 5000
}; ;
ConfigStorage configStorage = new ConfigStorage();
configStorage.SetMemento(original.CreateMemento());
original.ServerConfig = new ServerConfig
{
    Ip = "192.168.1.2",
    Port = 6000
}; 
configStorage.SetMemento(original.CreateMemento());
original.ServerConfig = new ServerConfig
{
    Ip = "192.168.2.1",
    Port = 1000
};
configStorage.SetMemento(original.CreateMemento());
original.ServerConfig = new ServerConfig
{
    Ip = "192.168.1.1",
    Port = 3000
}; 
configStorage.SetMemento(original.CreateMemento());
original.ServerConfig = new ServerConfig
{
    Ip = "192.168.1.127",
    Port = 5000
};
configStorage.SetMemento(original.CreateMemento());

var memento = configStorage.Undo();
Console.WriteLine(memento.ServerConfig.ToString());
memento = configStorage.Undo();
Console.WriteLine(memento.ServerConfig.ToString());
memento = configStorage.Undo();
Console.WriteLine(memento.ServerConfig.ToString());
memento = configStorage.Undo();
Console.WriteLine(memento.ServerConfig.ToString());
Console.WriteLine("---------------------");
memento = configStorage.Do();
Console.WriteLine(memento.ServerConfig.ToString());
memento = configStorage.Do();
Console.WriteLine(memento.ServerConfig.ToString());
memento = configStorage.Do();
Console.WriteLine(memento.ServerConfig.ToString());
memento = configStorage.Do();
Console.WriteLine(memento.ServerConfig.ToString());

Console.WriteLine("----------------");
memento = configStorage.Undo();
Console.WriteLine(memento.ServerConfig.ToString());
memento = configStorage.Undo();
Console.WriteLine(memento.ServerConfig.ToString());
memento = configStorage.Undo();
Console.WriteLine(memento.ServerConfig.ToString());
memento = configStorage.Undo();
Console.WriteLine(memento.ServerConfig.ToString());

Out:

Ip: 192.168.1.1, Port: 3000
Ip: 192.168.2.1, Port: 1000
Ip: 192.168.1.2, Port: 6000
Ip: 192.168.1.1, Port: 5000
---------------------
Ip: 192.168.1.2, Port: 6000
Ip: 192.168.2.1, Port: 1000
Ip: 192.168.1.1, Port: 3000
Ip: 192.168.1.127, Port: 5000
----------------
Ip: 192.168.1.1, Port: 3000
Ip: 192.168.2.1, Port: 1000
Ip: 192.168.1.2, Port: 6000
Ip: 192.168.1.1, Port: 5000
posted @ 2016-07-29 21:04  4Thing  阅读(124)  评论(0编辑  收藏  举报