zoukankan      html  css  js  c++  java
  • 乐在其中设计模式(C#) 观察者模式(Observer Pattern)

    [索引页]
    [源码下载]


    乐在其中设计模式(C#) - 观察者模式(Observer Pattern)


    作者:webabcd


    介绍
    定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。


    示例
    有一个Message实体类,某些对象对它的操作有Insert()方法,当发生某些改变的时候,通知所有这些对象并执行Insert()方法。



    MessageModel
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace Pattern.Observer
    {
        
    /// <summary>
        
    /// Message实体类
        
    /// </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; }
            }

        }

    }


    IMessage
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace Pattern.Observer
    {
        
    /// <summary>
        
    /// 操作Message的接口(Observer)
        
    /// </summary>

        public interface IMessage
        
    {
            
    /// <summary>
            
    /// 插入Message
            
    /// </summary>
            
    /// <param name="mm">Message实体对象</param>
            
    /// <returns></returns>

            string Insert(MessageModel mm);
        }

    }


    SqlMessage
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace Pattern.Observer
    {
        
    /// <summary>
        
    /// Sql方式操作Message(ConcreteObserver)
        
    /// </summary>

        public class SqlMessage : IMessage
        
    {
            
    /// <summary>
            
    /// 插入Message
            
    /// </summary>
            
    /// <param name="mm">Message实体对象</param>
            
    /// <returns></returns>

            public string Insert(MessageModel mm)
            
    {
                
    return "sql方式:" + mm.Message + " " + mm.PublishTime.ToString();
            }
     
        }

    }


    XmlMessage
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace Pattern.Observer
    {
        
    /// <summary>
        
    /// Xml方式操作Message(ConcreteObserver)
        
    /// </summary>

        public class XmlMessage : IMessage
        
    {
            
    /// <summary>
            
    /// 插入Message
            
    /// </summary>
            
    /// <param name="mm">Message实体对象</param>
            
    /// <returns></returns>

            public string Insert(MessageModel mm)
            
    {
                
    return "xml方式:" + mm.Message + " " + mm.PublishTime.ToString();
            }
     
        }

    }


    AbstractMessageSubject
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace Pattern.Observer
    {
        
    /// <summary>
        
    /// 抽象Message主题(Subject)
        
    /// </summary>

        public abstract class AbstractMessageSubject
        
    {
            
    private MessageModel _messageModel;
            
    private List<IMessage> list = new List<IMessage>();

            
    /// <summary>
            
    /// 构造函数
            
    /// </summary>
            
    /// <param name="mm">Message实体对象</param>

            public AbstractMessageSubject(MessageModel mm)
            
    {
                
    this._messageModel = mm;
            }


            
    /// <summary>
            
    /// 添加一个实现IMessage接口的对象
            
    /// </summary>
            
    /// <param name="m">实现IMessage接口的对象</param>

            public void Attach(IMessage m)
            
    {
                list.Add(m);
            }


            
    /// <summary>
            
    /// 移除一个实现IMessage接口的对象
            
    /// </summary>
            
    /// <param name="m">实现IMessage接口的对象</param>

            public void Detach(IMessage m)
            
    {
                list.Remove(m);
            }


            
    /// <summary>
            
    /// 通知所有观察者
            
    /// </summary>
            
    /// <returns></returns>

            public string Notify()
            
    {
                
    string s = "";
                
    foreach (IMessage i in list)
                
    {
                    s 
    += i.Insert(_messageModel);
                    s 
    += "<br />";
                }


                
    return s;
            }


            
    /// <summary>
            
    /// Message发布时间
            
    /// </summary>

            public DateTime PublishTime
            
    {
                
    get return _messageModel.PublishTime; }
                
    set
                
    {
                    _messageModel.PublishTime 
    = value;
                    Notify();
                }

            }

        }

    }


    MessageSubject
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace Pattern.Observer
    {
        
    /// <summary>
        
    /// Message主题(ConcreteSubject)
        
    /// </summary>

        public class MessageSubject : AbstractMessageSubject
        
    {
            
    /// <summary>
            
    /// 构造函数
            
    /// </summary>
            
    /// <param name="mm">Message实体对象</param>

            public MessageSubject(MessageModel mm)
                : 
    base(mm)
            
    {
     
            }

        }

    }



    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.Observer;

    public partial class Observer : System.Web.UI.Page
    {
        
    protected void Page_Load(object sender, EventArgs e)
        
    {
            MessageSubject m 
    = new MessageSubject(new MessageModel("插入Message", DateTime.Now));

            SqlMessage sqlMessage 
    = new SqlMessage();
            XmlMessage xmlMessage 
    = new XmlMessage();

            m.Attach(sqlMessage);
            m.Attach(xmlMessage);

            
    // System.Threading.Thread.Sleep(1000);
            
    // 修改了PublishTime就会通知所有观察者
            
    // m.PublishTime = DateTime.Now;
            
            Response.Write(m.Notify());
        }

    }


    运行结果
    sql方式:插入Message 2007-5-26 9:38:18
    xml方式:插入Message 2007-5-26 9:38:18


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


    OK
    [源码下载]
  • 相关阅读:
    POJ 3259 Wormholes【BellmanFord】
    POJ 2960 SNim【SG函数的应用】
    ZOJ 3578 Matrixdp水题
    HDU 2897 邂逅明下【bash博弈】
    BellmanFord 算法及其优化【转】
    【转】几个Java的网络爬虫
    thinkphp 反字符 去标签 自动加点 去换行 截取字符串 冰糖
    php 二维数组转 json文本 (jquery datagrid 数据格式) 冰糖
    PHP 汉字转拼音(首拼音,所有拼音) 冰糖
    设为首页与加入收藏 兼容firefox 冰糖
  • 原文地址:https://www.cnblogs.com/webabcd/p/760498.html
Copyright © 2011-2022 走看看