观察者模式是一种可以描述一对多对象依赖关系的行为模式。当一个对象状态发生变化时,依赖它的其它对象会自动被更新状态。下面这个图展示了观察者模式的层级:

举个例子吧,我们某个报表界面现在有个dashboard的数据发生变化,需要在它更新的时候去更新此页面上其它几个报表的数据那么可以使用观察者模式来实现。观察者模式有个很好的特点是能够对观察者的add/remve有很大的灵活性。
如果你对观察者模式还是不很了解,建议你看看这里这篇文章:
http://blog.csdn.net/dujingjing1230/archive/2009/08/10/4430778.aspx
http://blog.csdn.net/dujingjing1230/archive/2009/08/12/4438348.aspx
我假设你是个framework1.1的使用者,对2.0的Generics还不清楚,那么你必须先去了解了解Generics这个类库的基本使用。推荐你看看这个视频:
http://www.microsoft.com/uk/msdn/nuggets/nugget/128/Generics-in-NET-Framework-20.aspx
英文还可以的话建议你看看这本书:

我很喜欢这本书。差不多50$。。
如果你和我一样比较穷(上面的书是公司买的我庆幸。。。)最基本的是看这几篇文章吧:
http://www.codeproject.com/KB/cs/generics_explained.aspx
http://msdn.microsoft.com/zh-cn/library/system.collections.generic.aspx

Anyway, 你应该去学学它。
言归正传.现在举个例子,就是上面说的一个dashboard得数据发生变化时下面的报表需要跟着更新。这是说明观察者模式特经典的一个例子。
1. 创建一个asp.net的web应用程序。
2. 创建一个主题类(DashboardPage)然后添加它需要的属性和方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for DashboardPage
/// </summary>
public class DashboardPage : System.Web.UI.Page {
private List<IReport> _ReportCollection = new List<IReport>();

public string SelectedProduct { get; set; }
public DateTime SelectedDate { get; set; }

public DashboardPage() {
}

public void Add(IReport module) {
_ReportCollection.Add(module);
}

public void Remove(IReport module) {
_ReportCollection.Remove(module);
}

public void Update() {
foreach (IReport m in _ReportCollection) {
m.Update(this);
}
}
这个主题类将会作为参数传递给每个报表。
3. 创建一个观察者接口来添加Update方法的定义。所有的观察者类都需要继承这个接口。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for IReport
/// </summary>
public interface IReport
{
void Update(DashboardPage page);
}
使用这个接口而不是直接在每个观察者的类中把DashboardPage作为它们的参数是为了让我们的实现更加灵活。
4. 添加一个SalesDashboard.aspx页面让它的后台代码继承DashboardPage类。然后为它添加一个dropdownlist和一个calendar。
5. 创建两个webUserControls作为两个报表,一定记住需要继承接口IReport。Update方法的实例化:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class SalesReport2 : System.Web.UI.UserControl, IReport
{
protected void Page_Load(object sender, EventArgs e)
{

}

#region IReport Members

public void Update(DashboardPage page) {
this.Label1.Text = page.SelectedProduct;
this.Label2.Text = page.SelectedDate.ToLongDateString();
}

#endregion
}

前台:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SalesReport2.ascx.cs" Inherits="SalesReport2" %>
<h2>Sales Report 2</h2>
Sales data for the product: <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
<br />
Updated Date: <asp:Label ID="Label2" runat="server" Text=""></asp:Label>
6. 最后一步就是在Salesdasnboard.aspx页面加载时需要添加吧两个报表都添加到List<IReport>中。以便在Update的时候这两个Report都能执行Update(DashboardPage)方法。
protected override void OnLoad(EventArgs e) {
SelectedProduct = this.DropDownList1.SelectedValue;
SelectedDate = this.Calendar1.SelectedDate;

Add(SalesReport11);
Add(SalesReport21);

base.OnLoad(e);
}
7. 运行结果:

附上代码:
http://download.csdn.net/source/1652674

观察者模式使用WebForm实现的例子的更多相关文章

  1. Webform 三级联动例子

    首先分别做三个下拉列表 <body> <form id="form1" runat="server"> <asp:DropDown ...

  2. 读headFirst设计模式 - 观察者模式

    上次学习了策略模式,这次来学习观察者模式.这次先把书上的例子学习一下,然后再自己写一个例子,看是否能做到举一反三(或者说触类旁通),不过要想真正的掌握还要多多思考和练习. 学习书上的例子 现在我们有一 ...

  3. 快速入门系列--MVC--02路由

    现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...

  4. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  5. 环信Restfull API dotnetSDK

    Easemob.Restfull4Net 环信Restfull API dotnet的封装 支持的.Net Framework版本:4.0 API地址:http://docs.easemob.com/ ...

  6. C# WinForm开发系列 - ZedGraph

    ZedGraph是用于创建任意数据的二维线型.条型.饼型图表的一个类库,也可以作为Windows窗体用户控件和Asp.Net网页控件.这个类库具有高度的适应性,几乎所有式样的图表都能够被创建.这个类库 ...

  7. [GeekBand] 面向对象的设计模式(C++)(2)

    本篇笔记紧接上篇,继续学习设计模式. 4. 对象创建类设计模式 通过对象创建模式绕开new,来避免对象创建(new)过程中所导致的紧耦合,从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 4.1 ...

  8. 事件总线(Event Bus)知多少

    源码路径:Github-EventBus 简书同步链接 1. 引言 事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉.事件总线是对发布-订阅模式的一种实现.它是一种集 ...

  9. Autofac解耦事件总线

    事件总线之Autofac解耦 事件总线是通过一个中间服务,剥离了常规事件的发布与订阅(消费)强依赖关系的一种技术实现.事件总线的基础知识可参考圣杰的博客[事件总线知多少] 本片博客不再详细概述事件总线 ...

随机推荐

  1. jmeter之自动重定向和跟随重定向用法

    jmeter工具里面有自动重定向和跟随重定向这2种选择,那么他们到底有啥区别呢? 目录 1.自动重定向和跟随重定向 2.举个例子 1.自动重定向和跟随重定向 01.3XX的请求一般要使用跟随重定向,2 ...

  2. 《Selenium 2自动化测试实战 基于Python语言》中发送最新邮件无内容问题的解决方法

    虫师的<Selenium 2自动化测试实战 基于Python语言>是我自动化测试的启蒙书 也是我推荐的自动化测试入门必备书,但是书中有一处明显的错误,会误导很多读者,这处错误就是第8章自动 ...

  3. openstack 制作镜像以及windows向Linux中通过xshell传文件

    慢慢的也要把openstack一些相关的笔记整理上来了 之前由于主要是在看horizon 实验室搭建的openstack平台并没有怎么实际的用起来,前几天别的同学要用来测试大数据的相关服务,才把这些内 ...

  4. gdi+ 中发生一般性错误

    1.检查文件夹权限 2.保存的文件已存在并因某种原因被锁定. 3.文件夹路径不存在

  5. JMeter学习笔记16-如何输出HTML格式的性能测试报告

    文本来学习下,如何输入HTML格式的JMeter测试报告.前面已经介绍, 如果要做性能测试,需要在GUI上设计好你的Test Plan,设置各种场景和负载值,包括多少个线程,多少个用户,循环多少次.设 ...

  6. STL 配接器(adapters)

    定义 配接器(adapters):将一个class的接口,转换为另一个class的接口,使得原来不能一起使用相互兼容的classes,可以一起协同工作. 配接器是一种设计模式. STL中提供的各种配接 ...

  7. 最好用的 Kafka Json Logger Java客户端,赶紧尝试一下

    最好用的 Kafka Json Logger Java客户端. slf4j4json 最好用的 Kafka Json Logger 库:不尝试一下可惜了! Description 一款为 Kafka ...

  8. HDU_2007

    /** *注意:输入的两个数字的大小并不确定 */ #include <iostream> #include <stdio.h> #include <string.h&g ...

  9. Form表单组件验证

    第一版:最基本版本 views源码 #——————————————————————form验证—————————————— from django import forms from django.f ...

  10. jenkins使用记录转自https://my.oschina.net/sanpeterguo/blog/197931

    摘要: jenkins(持续集成开源工具)提供了丰富的api接口,基本上所有的操作都可以使用curl来从后台调度,包括:创建项目,禁用项目,启用项目,获取项目描述,获取配置文件,普通触发,scm触发, ...