原文:乐在其中设计模式(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

[源码下载]

乐在其中设计模式(C#) - 观察者模式(Observer Pattern)的更多相关文章

  1. 二十四种设计模式:观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...

  2. [设计模式] 19 观察者模式 Observer Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.当一个 ...

  3. c#设计模式之观察者模式(Observer Pattern)

    场景出发 一个月高风黑的晚上,突然传来了尖锐的猫叫,宁静被彻底打破,狗开始吠了,大人醒了,婴儿哭了,小偷跑了 这个过程,如果用面向对象语言来描述,简单莫过于下: public class Cat { ...

  4. 设计模式之观察者模式(Observer pattern)

    最近参加了一次面试,其中笔试题有一道编程题,在更换掉试题的描述场景后,大意如下: 上课铃声响起,学生A/B/C/D进入教室:下课铃声响起,学生A/B/C/D离开教室. 要求使用设计模式的思想完成铃与学 ...

  5. 设计模式九: 观察者模式(Observer Pattern)

    简介 观察者属于行为型模式的一种, 又叫发布-订阅模式. 如果一个对象的状态发生改变,依赖他的对象都将发生变化, 那么这种情况就适合使用观察者模式. 它包含两个术语,主题(Subject),观察者(O ...

  6. 【设计模式】观察者模式 Observer Pattern

    定义:观察者模式定义了对象之间的一对多依赖.当“主题”(Object)状态改变事,所有依赖它的“观察者”(Observer)都会受到通知并自动更新.主题支持观察者订阅和退订. 观察者模式提供了一种对象 ...

  7. 【UE4 设计模式】观察者模式 Observer Pattern

    概述 描述 定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做 发布-订阅(Publish/Subscribe)模式 模型-视图(M ...

  8. 设计模式-观察者模式(Observer Pattern)

    观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...

  9. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

随机推荐

  1. POJ 2318 TOYS(计算几何)

    跨产品的利用率推断点线段向左或向右,然后你可以2分钟 代码: #include <cstdio> #include <cstring> #include <algorit ...

  2. c#常见stream操作

    原文: c#常见stream操作 常见并常用的stream一共有 文件流(FileStream), 内存流(MemoryStream), 压缩流(GZipStream), 加密流(CrypToStre ...

  3. Unity MegaFiers 顶点动画

        使用 MegaFiers 插件,能够使得Unity支持顶点动画的播放. 官方视频教程例如以下: 在这里简单測试使用下,环境例如以下: Blender 2.72 Unity 4.5.4 Mega ...

  4. 不知道的JavaScript

    你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章  初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目吸 ...

  5. Selenium 2.0 WebDriver 自动化测试 使用教程 实例教程 API快速参考

    Selenium 2.0 WebDriver 自动化测试 使用教程 实例教程 API快速参考 //System.setProperty("webdriver.firefox.bin" ...

  6. WindowsclientC/C++编程规范“建议”——前言

    前言 工作中接触了非常多编程规范.当中最有意思的是,公司近期公布了一版C/C++编程规范,然后我看到该规范的最后一段时,有这么一句:"该规范不适用于Windows平台开发".看来这 ...

  7. URAL1113(数学)

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1113 根据样例分析: 1.沙漠只有500公里或者更短,这时很简单,一次搞定. 2.沙漠6 ...

  8. 依据二度人脉推荐好友sql

    friend表结构 DROP TABLE IF EXISTS FRIEND; create table friend(     uid        bigint not null comment ' ...

  9. hibernate得知——Set设置配置

    Set设置配置 创建数据表:表关系的员工有多重身份 create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR ...

  10. warning: directory not found for option &#39; &#39;

    解决: 选择项目名称-->Targets-->Build Settings-->Search Paths-->Library Search Paths 删除相应路径