原文:乐在其中设计模式(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. 非对称加密RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。使用最广泛的是RSA算法

          非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密:如果用私 ...

  2. Android 的独特shell命令

    Android本来就是一个linux操作系统,所以大部分都是linux的命令,如mkdir,ls,netstat,mount,ps 等,这里就不具体介绍了, 主要介绍几个Android特有的. get ...

  3. 图像特征提取方法:Bag-of-words

    Bag-of-words简单介绍 最初的Bag-of-words ,也叫做"词袋",在信息检索中,Bag-of-words model假定对于一个文本,忽略其词序和语法,句法,将其 ...

  4. Discount Diesel Time 9150-1 Quartz Wrist watch [WAT022]- US$4.49

    Discount Diesel Time 9150-1 Quartz Wrist watch [WAT022]- US$4.49 Diesel Time 9150-1 Quartz Wrist wat ...

  5. hdu4956 Poor Hanamichi

    解决暴力的直接方法.一个直接的推论x%11方法. 打表可以发现,以解决不同的情况都不会在很大程度上会出现. 所以从l暴力开始枚举.找到的第一个错误值输出要. 如果它超过r同样在美国发现-1. #inc ...

  6. MySQL中Procedure事务编写基础笔记

    原文:MySQL中Procedure事务编写基础笔记 目录: 一.PROCEDURE: 二.CREATE PROCEDURE基本语法: 三.PROCEDURE小进阶   3.1.基本的DECLARE语 ...

  7. [C++/CLI编程宝典][2]什么是C++/CLI语言

    对于什么是C++/CLI,我们首先能够简单的将其名字划分为两部分来理解,第一,C++,我们熟悉的眼下被广泛使用的面向对象的ISO国际标准的高级语言,也称为ISOC++,我们这里以后均称其为ISOC++ ...

  8. SQLServer2012 分页语句执行分析

    上一篇文章提到了,SQLServer2012在使用Offset,Fetch语句分页时,获取了大量不需要的数据,导致查询效率低的问题. 现在让我们来看看,究竟是什么导致SQLServer不能按需取数呢? ...

  9. hdu4857 逃生 bestcoder round1 A

    题目要求要求在满足约束条件的情况下,使小的序号尽力靠前. 坑点就在这里.小的序号尽量靠前并非代表字典序,它要求多种情况时,先使1靠前(可能1仅仅能在第2或第3位 那么就要使它在第2位),其次2,3. ...

  10. 如何让HTML在手机上实现直接拨打电话以及发送短信?

    拨打电话的HTML实现方式: <a href="tel:134289210xx″>拨打电话</a> 上面是比较常用的方式,但是有可能在某些场景下是支持不太好,可以试用 ...