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

原文:乐在其中设计模式(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
[源码下载]

时间: 2024-08-31 02:11:35

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

观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove)\通知(notify)观察者; 观察者(observer)接口, 负责更新(update)数据; 主题(subject)接口: 注册观察者(registerObserver), 删除观察者(removeObserver), 通知观察者(

乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabcd 介绍 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 示例 有一个Message实体类,某个类对它的操作有Insert()和Get()方法.现在需要把这个类转到另一个接口,分别对应Add()和Select()方法. Mess

乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)

原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:webabcd 介绍 动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活. 示例 有一个Message实体类,某个对象对它的操作有Insert()和Get()方法,现在扩展这个对象的功能. MessageModel using System;using System.Collecti

【设计模式】—— 观察者模式Observer

模式意图 观察者模式,也叫发布/订阅模式,从名字来说就能察觉到它的过程应该是,发布--其他人接受. 这个模式定义了对象之间的一种依赖关系,当一个对象发生变化时,其他的对象收到更新,也发生变化. 模拟我们订阅邮件这个场景,不管我们的邮箱是在登陆还是关闭,邮件都会发送到邮箱里面.只要把自己的邮箱订阅到这个邮件就可以了!这个模式也是这样一个过程. 这个模式代码相对来说比较容易理解,而且应用很广泛. 应用场景 1 当一个模型有几个展现方面,通过修改一个展现,顺便更新其他的.就好比一个网站的有web端,也

设计模式之观察者模式 (Observer Design Pattern)

一.什么是观察者模式 观察者定义了一种一对多的依赖关系,当一个主题(Subject)对象状态发生变化时,所有依赖它的相关对象都会得到通知并且能够自动更新自己的状态,这些依赖的对象称之为观察者(Observer)对象这类似于发布/订阅模式. 观察者模式中的主题对象,会维持着一个依赖它的观察者对象列表,当主题对象状态发生改变时,主题对象便会调用这个列表中所有观察者对象的方法. 观察者模式一般用在分布式时间处理系统,它也是流行的MVC模型的核心设计模式. 二.观察者模式中的角色 观察者模式主要涉及到三

观察者模式(Observer Pattern) Java内置使用方法

Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数: Observerable(可被观察的): 是一个父类(class),addObserver(), 添加观察者; deleteObserver(), 删除观察者; notifyObservers(), 通知观察者;setChanged(), 确认更改; Observer(观察者): 是一个接口(interface), update(), 更新观察者数据; setChanged()->notifyObservers(),

PHP设计模式之观察者模式示例介绍

 这篇文章主要介绍了PHP设计模式之观察者模式(Observer)详细介绍和代码实例,需要的朋友可以参考下 [意图]   定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新[GOF95] 又称为发布-订阅(Publish-Subscribe)模式.模型-视图(Model-View)模式.源-监听(Source-Listener)模式.或从属者(Dependents)模式   [观察者模式结构图]       [观察者模式中主要角色]   1.抽

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

意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.[GOF <设计模式>] 结构图 图1 Observer模式结构图 生活中的例子 观察者定义了对象间一对多的关系,当一个对象的状态变化时,所有依赖它的对象都得到通知并且自动地更新.拍卖演示了这种模式.每个投标人都有一个标有数字的牌子用于出价.拍卖师开始拍卖时,他观察是否有牌子举起出价.每次接受一个新的出价都改变了拍卖的当前价格,并且广播给所有的投标人进行新的出价. 图2 使用拍卖例子

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

概述 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系" --一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化.使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合. 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.[GOF <设计模式>] 结构图 图1 Observer模式