天天看點

樂在其中設計模式(C#) - 備忘錄模式(Memento Pattern)

樂在其中設計模式(C#) - 備忘錄模式(Memento Pattern)

介紹

在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态。這樣以後就可将該對象恢複到儲存的狀态。

示例

有一個Message實體類,某個對象對它的操作有Insert()方法,隻有在插入時間符合要求的情況下才能插入成功,是以要求可以儲存和恢複Message對象的狀态,插入失敗後則恢複Message對象的狀态,然後隻更新時間,再次插入。

MessageModel

using System; 

using System.Collections.Generic; 

using System.Text; 

namespace Pattern.Memento 

        /// <summary> 

        /// Message實體類(Memento) 

        /// </summary> 

        public class MessageModel 

        { 

                /// <summary> 

                /// 構造函數 

                /// </summary> 

                /// <param name="msg">Message内容</param> 

                /// <param name="pt">Message釋出時間</param> 

                public MessageModel(string msg, DateTime pt) 

                { 

                        this._message = msg; 

                        this._publishTime = pt; 

                } 

                private string _message; 

                /// Message内容 

                public string Message 

                        get { return _message; } 

                        set { _message = value; } 

                private DateTime _publishTime; 

                /// Message釋出時間 

                public DateTime PublishTime 

                        get { return _publishTime; } 

                        set { _publishTime = value; } 

        } 

}

MessageModelCaretaker

        /// Memento管理者(Caretaker) 

        public class MessageModelCaretaker 

                private MessageModel _messageModel; 

                /// Message實體對象(Memento) 

                public MessageModel MessageModel 

                        get { return _messageModel; } 

                        set { _messageModel = value; } 

SqlMessage

        /// Sql方式操作Message(Originator) 

        public class SqlMessage 

                /// 插入Message 

                /// <param name="mm">Message實體對象</param> 

                /// <returns></returns> 

                public bool Insert(MessageModel mm) 

                        // 秒數可以被5整除時,則執行插入操作 

                        if (mm.PublishTime.Second % 5 == 0) 

                        { 

                                // 代碼略 

                                return true; 

                        } 

                        else 

                                return false; 

                /// 儲存Memento 

                public MessageModel SaveMemento() 

                        return new MessageModel(_message, _publishTime); 

                /// 恢複Memento 

                /// <param name="mm"></param> 

                public void RestoreMemento(MessageModel mm) 

                        this._message = mm.Message; 

                        this._publishTime = mm.PublishTime; 

Test

using System.Data; 

using System.Configuration; 

using System.Collections; 

using System.Web; 

using System.Web.Security; 

using System.Web.UI; 

using System.Web.UI.WebControls; 

using System.Web.UI.WebControls.WebParts; 

using System.Web.UI.HtmlControls; 

using Pattern.Memento; 

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()); 

                        Response.Write("<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

參考

<a href="http://www.dofactory.com/Patterns/PatternMemento.aspx" target="_blank">http://www.dofactory.com/Patterns/PatternMemento.aspx</a>

OK

<a href="http://down.51cto.com/data/100859" target="_blank">[源碼下載下傳]</a>

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/344578,如需轉載請自行聯系原作者