设计模式实践-备忘录模式
场景
备忘配置文件,实现配置文件的撤销和重做操作
实现代码
配置文件类型
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