乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

简介:
[索引页]
[源码下载]


乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)


作者: webabcd


介绍
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。


示例
有一个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; 
                 /// <summary> 
                 /// Message内容 
                 /// </summary> 
                 public  string Message 
                { 
                        get {  return _message; } 
                        set { _message = value; } 
                } 
 
                 private DateTime _publishTime; 
                 /// <summary> 
                 /// Message发布时间 
                 /// </summary> 
                 public DateTime PublishTime 
                { 
                        get {  return _publishTime; } 
                        set { _publishTime = value; } 
                } 
        } 
}
 

MessageModelCaretaker
using System; 
using System.Collections.Generic; 
using System.Text; 
 
namespace Pattern.Memento 

         /// <summary> 
         /// Memento管理者(Caretaker) 
         /// </summary> 
         public  class MessageModelCaretaker 
        { 
                 private MessageModel _messageModel; 
 
                 /// <summary> 
                 /// Message实体对象(Memento) 
                 /// </summary> 
                 public MessageModel MessageModel 
                { 
                        get {  return _messageModel; } 
                        set { _messageModel = value; } 
                } 
        } 
}
 
SqlMessage
using System; 
using System.Collections.Generic; 
using System.Text; 
 
namespace Pattern.Memento 

         /// <summary> 
         /// Sql方式操作Message(Originator) 
         /// </summary> 
         public  class SqlMessage 
        { 
                 private  string _message; 
                 /// <summary> 
                 /// Message内容 
                 /// </summary> 
                 public  string Message 
                { 
                        get {  return _message; } 
                        set { _message = value; } 
                } 
 
                 private DateTime _publishTime; 
                 /// <summary> 
                 /// Message发布时间 
                 /// </summary> 
                 public DateTime PublishTime 
                { 
                        get {  return _publishTime; } 
                        set { _publishTime = value; } 
                } 
 
                 /// <summary> 
                 /// 插入Message 
                 /// </summary> 
                 /// <param name="mm">Message实体对象</param> 
                 /// <returns></returns> 
                 public  bool Insert(MessageModel mm) 
                { 
                         // 秒数可以被5整除时,则执行插入操作 
                         if (mm.PublishTime.Second % 5 == 0) 
                        { 
                                 // 代码略 
                                 return  true
                        } 
                         else 
                        { 
                                 return  false
                        } 
                } 
 
                 /// <summary> 
                 /// 保存Memento 
                 /// </summary> 
                 /// <returns></returns> 
                 public MessageModel SaveMemento() 
                { 
                         return  new MessageModel(_message, _publishTime); 
                } 
 
                 /// <summary> 
                 /// 恢复Memento 
                 /// </summary> 
                 /// <param name="mm"></param> 
                 public  void RestoreMemento(MessageModel mm) 
                { 
                         this._message = mm.Message; 
                         this._publishTime = mm.PublishTime; 
                } 
        } 
}
 
Test
using System; 
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


参考
http://www.dofactory.com/Patterns/PatternMemento.aspx


OK
[源码下载]



     本文转自webabcd 51CTO博客,原文链接: http://blog.51cto.com/webabcd/344578 ,如需转载请自行联系原作者




相关文章
|
2月前
|
设计模式 安全 Java
C# 一分钟浅谈:设计模式之单例模式
【10月更文挑战第9天】单例模式是软件开发中最常用的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。本文介绍了单例模式的基本概念、实现方式(包括饿汉式、懒汉式和使用 `Lazy&lt;T&gt;` 的方法)、常见问题(如多线程和序列化问题)及其解决方案,并通过代码示例详细说明了这些内容。希望本文能帮助你在实际开发中更好地应用单例模式,提高代码质量和可维护性。
69 1
|
3月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
3月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
3月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
4月前
|
设计模式 算法 C#
C#设计模式之策略模式
C#设计模式之策略模式
90 19
|
4月前
|
设计模式 安全 程序员
C#设计模式之单例模式
C#设计模式之单例模式
57 3
|
4月前
|
设计模式 算法
设计模式的基础问题之备忘录模式在软件开发的问题如何解决
设计模式的基础问题之备忘录模式在软件开发的问题如何解决
|
5月前
|
设计模式 数据处理
iLogtail设计模式问题之什么是备忘录模式
iLogtail设计模式问题之什么是备忘录模式
|
5月前
|
设计模式 存储 C#