1、
interface IOriginator<T>
where T : IState
{
/// <summary>
/// 保存一個備忘
/// </summary>
/// <remarks>
/// 默認方式——當前所有數據的全備忘
/// </remarks>
void SaveCheckPoint();
/// <summary>
/// 恢復一個備忘
/// </summary>
/// <remarks>
/// 默認方式——恢復最近一次全備忘
/// </remarks>
void Undo();
/// <summary>
/// 保存一個備忘
/// </summary>
/// <param name="name">備忘的名稱</param>
void SaveCheckPoint(string name);
/// <summary>
/// 恢復一個備忘
/// </summary>
/// <param name="name">備忘的名稱</param>
void Undo(string name);
/// <summary>
/// 保存一個備忘
/// </summary>
/// <param name="name">備忘的名稱</param>
/// <param name="version">備忘的版本</param>
void SaveCheckPoint(string name, string version);
/// <summary>
/// 恢復一個備忘
/// </summary>
/// <param name="name">備忘的名稱</param>
/// <param name="version">備忘的版本</param>
void Undo(string name, string version);
/// <summary>
/// 保存一個備忘
/// </summary>
/// <param name="name">備忘的名稱</param>
/// <param name="version">備忘的版本</param>
/// <param name="subjectName">業務主題名稱</param>
void SaveCheckPoint(string name, string version, string subjectName);
/// <summary>
/// 恢復一個備忘
/// </summary>
/// <param name="name">備忘的名稱</param>
/// <param name="version">備忘的版本</param>
/// <param name="subjectName">業務主題名稱</param>
void Undo(string name, string version, string subjectName);
/// <summary>
/// 保存一個備忘
/// </summary>
/// <param name="name">備忘的名稱</param>
/// <param name="version">備忘的版本</param>
/// <param name="subjectName">業務主題名稱</param>
/// <param name="start">時間區間起點</param>
/// <param name="end">時間區間終點</param>
void SaveCheckPoint(string name, string version, string subjectName, DateTime start, DateTime end);
/// <summary>
/// 恢復一個備忘
/// </summary>
/// <param name="name">備忘的名稱</param>
/// <param name="version">備忘的版本</param>
/// <param name="subjectName">業務主題名稱</param>
/// <param name="start">時間區間起點</param>
/// <param name="end">時間區間終點</param>
void Undo(string name, string version, string subjectName, DateTime start, DateTime end);
}
2、集成Memento和CoR
示例說明:
1) 為了簡化示例,用string替換IState 接口
2)CoR沒有采用鏈表方式,而是通過LINQ方式實現
3) CoR中的每個Handler設計為具有閉合操作的接口(壓縮、簽名、加密等,在恢復的時候還需要進行對應的反向處理)
4)在SaveCheckPoint()和Undo()的過程中分別調用CoR的正向處理和反向處理
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace MarvellousWorks.PracticalPattern.Memento.Tests.Exercise
{
[TestClass]
public class MementoCoRFixture
{
/// <summary>
/// 為了簡化沒有定義原發器接口,直接定義了原發器類型
/// </summary>
class Originator
{
public string State { get; set; }
Memento m;
public HandlerCoRBuilder<string> HandlerCoRBuilder { get; set; }
/// <summary>
/// 把備忘錄定義為原發器的內部類型
/// </summary>
/// <typeparam name="T"></typeparam>
class Memento
{
public string State { get; set; }
}
/// <summary>
/// 把狀態保存到備忘錄
/// </summary>
public virtual void SaveCheckpoint()
{
Trace.WriteLine("
Originator.void SaveCheckpoint()
-----------------");
m = new Memento()
{
State = ProcessState(HandlerCoRBuilder.BuildUpProcessCoR(), this.State)
};
}
/// <summary>
/// 從備忘錄恢復之前的狀態
/// </summary>