惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
IT之家
IT之家
Cyberwarzone
Cyberwarzone
T
Troy Hunt's Blog
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
T
Threat Research - Cisco Blogs
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
G
GRAHAM CLULEY
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 叶小钗
Last Week in AI
Last Week in AI
C
CERT Recently Published Vulnerability Notes
The Hacker News
The Hacker News
Jina AI
Jina AI
T
Tor Project blog
V
Vulnerabilities – Threatpost
酷 壳 – CoolShell
酷 壳 – CoolShell
Spread Privacy
Spread Privacy
博客园_首页
C
Cybersecurity and Infrastructure Security Agency CISA
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Simon Willison's Weblog
Simon Willison's Weblog
Security Latest
Security Latest
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 司徒正美
V2EX - 技术
V2EX - 技术
I
Intezer
The Cloudflare Blog
Cisco Talos Blog
Cisco Talos Blog
SecWiki News
SecWiki News
博客园 - 【当耐特】
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
L
Lohrmann on Cybersecurity
Scott Helme
Scott Helme
Google Online Security Blog
Google Online Security Blog
量子位
The Last Watchdog
The Last Watchdog
AI
AI
Application and Cybersecurity Blog
Application and Cybersecurity Blog
S
Security Affairs
P
Palo Alto Networks Blog
S
Secure Thoughts
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Attack and Defense Labs
Attack and Defense Labs

博客园 - Rain@sz

C#多线程编程(转) 调用webservice类(转) webService动态编译(编译在内存中,不会有权限问题) 什么是AOP? (摘) 阿里巴巴信息抓取器 脏读、不可重复读和虚读。(数据库)摘 c#写Activex控件(.Net 2.0) SPS中模拟登陆 sql server 2005分页存储过程和sql server 2000分页存储过程(摘) net的辅助工具 ajax基本函数--js Interpreter Pattern(解释器模式) State Pattern(状态模式) Mediator Pattern(中介者模式) 动态调用Webservice(摘) 分页--页脚控件 RSS 标准 DP-還未添加 DP-职责链模式(Chain of Responsibility)
Memento Pattern(备忘录模式)
Rain@sz · 2007-11-08 · via 博客园 - Rain@sz

设计模式 - 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