承接前兩篇結構定義,本文展示客戶端測試代碼與運行結果,驗證「插入失敗 → 恢復狀態 → 更新時間 → 重試」完整流程。
public partial class Memento : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SqlMessage m = new SqlMessage();
m.Message = "Message內容";
m.PublishTime = DateTime.Now;
MessageModelCaretaker mmc = new MessageModelCaretaker();
mmc.MessageModel = m.SaveMemento(); // 備份初始狀態
bool bln = false;
while (!bln)
{
bln = m.Insert(new MessageModel(m.Message, m.PublishTime));
Response.Write(m.Message + " " + m.PublishTime.ToString() + " " + bln.ToString() + "<br />");
if (!bln)
{
System.Threading.Thread.Sleep(1000);
m.RestoreMemento(mmc.MessageModel); // 失敗則恢復狀態
m.PublishTime = DateTime.Now; // 僅更新時間重試
}
}
}
}
Message內容 2007-5-23 21:32:13 False Message內容 2007-5-23 21:32:14 False Message內容 2007-5-23 21:32:15 True
第三秒秒數 15 可被 5 整除,Insert 回傳 true 結束迴圈。備忘錄模式完美實現「不破壞封裝下捕獲內部狀態、外部保存、隨時恢復」。