乐在其中设计模式(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)的更多相关文章
- 二十四种设计模式:观察者模式(Observer Pattern)
观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...
- [设计模式] 19 观察者模式 Observer Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.当一个 ...
- c#设计模式之观察者模式(Observer Pattern)
场景出发 一个月高风黑的晚上,突然传来了尖锐的猫叫,宁静被彻底打破,狗开始吠了,大人醒了,婴儿哭了,小偷跑了 这个过程,如果用面向对象语言来描述,简单莫过于下: public class Cat { ...
- 设计模式之观察者模式(Observer pattern)
最近参加了一次面试,其中笔试题有一道编程题,在更换掉试题的描述场景后,大意如下: 上课铃声响起,学生A/B/C/D进入教室:下课铃声响起,学生A/B/C/D离开教室. 要求使用设计模式的思想完成铃与学 ...
- 设计模式九: 观察者模式(Observer Pattern)
简介 观察者属于行为型模式的一种, 又叫发布-订阅模式. 如果一个对象的状态发生改变,依赖他的对象都将发生变化, 那么这种情况就适合使用观察者模式. 它包含两个术语,主题(Subject),观察者(O ...
- 【设计模式】观察者模式 Observer Pattern
定义:观察者模式定义了对象之间的一对多依赖.当“主题”(Object)状态改变事,所有依赖它的“观察者”(Observer)都会受到通知并自动更新.主题支持观察者订阅和退订. 观察者模式提供了一种对象 ...
- 【UE4 设计模式】观察者模式 Observer Pattern
概述 描述 定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做 发布-订阅(Publish/Subscribe)模式 模型-视图(M ...
- 设计模式-观察者模式(Observer Pattern)
观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...
- 设计模式 - 观察者模式(Observer Pattern) 详细说明
观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
随机推荐
- ssh, maven and eclipse
那些破事
Unix根据该理念keep it simple, keep it stupid.可在j2ee有keep it complex, keep it smart. 所以,我彻底晕菜. 最后能活着把sprin ...
- [Linux]Centos git报错fatal: HTTP request failed
在使用git pull.git push.git clone会报类似例如以下的错误: error: The requested URL returned error: 401 Unauthorized ...
- Working with forms
翻译 Django文档 Version 1.5 https://docs.djangoproject.com/en/1.5/topics/forms Working with forms 关于此文章: ...
- linux进程解析--进程的退出及销毁
一进程的退出: 当一个进程运行完毕或者因为触发系统异常而退出时,最终会调用到内核中的函数do_exit(),在do_exit()函数中会清理一些进程使用的文件描述符,会释放掉进程用户态使用的相关的物理 ...
- Study note for Continuous Probability Distributions
Basics of Probability Probability density function (pdf). Let X be a continuous random variable. The ...
- vps自己搭建VPN(转)
1.购买一个VPS: https://www.pzea.com/North-America-openvz-vps.html 2.下载putty软件,进行vpn安装: http://www.chiark ...
- 潜水JVM
原文地址:http://blog.jamesdbloom.com/JVMInternals.html(转载请注明出处和本文地址英文原文) 本文简要解析JVM的内部结构.下图显示了一个典型的一块JVM( ...
- uva297(quadtree)
给我们两棵quadtree的前序遍历,要我吗求原来32*32的矩阵有多少个位置是黑的 quardtree是将区域划分为相等的4个子空间,然后再递归划分这4个子空间,知道满足条件后终止划分 这题的终止条 ...
- Windows Phone开发(15):资源
原文:Windows Phone开发(15):资源 活字印刷术是我国"四大发明"之一,毕昇在发明活字印刷术之后,他很快发现一个问题,随着要印刷资料的不断增加,要用到的汉字数目越来越 ...
- 基于Office 365 无代码工作流分析-需求基本分析!
客户需求分析: 嘉昊信息是一家IT创业型公司,因为公司初创,有较多的招聘员工的需求,公司近期购买了Office 365,因为招聘工作繁琐,HR人员须要做非常多反复繁琐工作,HR主管提议开发一个招 ...