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

举个例子吧,我们某个报表界面现在有个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. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_2_Map常用子类

    常用的实现类HashMap 它的子类.LinkedHaspMap

  2. 【ABAP系列】SAP GUI740 PATCH5出现弹窗BUG

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP GUI740 PATCH ...

  3. 【ABAP系列】SAP F4搜索帮助的高级版

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP F4搜索帮助的高级版   ...

  4. CSP2019 —— 今年欢笑复明年,不知退役在眼前

    关于2019CSP-J/-S的一些体会 又是一年退役季,想起在群里看到大佬的一句诗,感慨万千. 今年欢笑复明年,不知退役在眼前 于是便心生文意,随便写点东西来给自己康康. 先说说这次的成绩吧.大家应该 ...

  5. [19/05/16-星期四] HTML_body标签(表格标签)

    一.概念 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  6. HDU 3228 题解(最小生成树)(Kruskal)(内有详细注释)

    Problem Description A group of explorers has found a solitary island. They land on the island and ex ...

  7. 模块管理常规功能自己定义系统的设计与实现(15--进一步完好"省份"模块)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jfok/article/details/24737483 "省份"模块的进一步完 ...

  8. usleep和sleep

    usleep 和 sleep 都是用于将进程挂起, 所不同的是前者在微秒级别, 后者在秒级别.

  9. Add JWT Bearer Authorization to Swagger and ASP.NET Core

    Add JWT Bearer Authorization to Swagger and ASP.NET Core     If you have an ASP.NET Core web applica ...

  10. python Opencv图像基础操作

    读取并显示图像 如果读取图像首先要导入OpenCV包,方法为: import cv2 读取并显示图像 img = cv2.imread("C:\test1.jpg") OpenCV ...