65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 中的观察者模式

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (4投票s)

2009年9月10日

CPOL

4分钟阅读

viewsIcon

49802

downloadIcon

861

本文将向您展示如何在 ASP.NET 应用程序中使用观察者模式。

引言

本文将向您展示如何在 ASP.NET 应用程序中使用观察者模式。

什么是观察者模式?

观察者模式是一种行为模式,它允许对象之间存在一对多的依赖关系,当一个对象的状态发生变化时,所有依赖的对象都会自动收到通知并更新。下图将展示观察者模式的类层次结构。典型的仪表板网页可以作为观察者模式实现的绝佳示例。设想一个带有多个报表的销售仪表板网页。当仪表板页面中的任何值发生变化时,所有相关的报表都应该相应地更改/更新。观察者模式允许动态地向仪表板页面添加/删除报表,从而使其独立运行。下图将为您提供观察者模式类层次结构的详细视图。

Observer Pattern Class diagram

实现

为了彻底理解观察者模式,请遵循以下 ASP.NET 应用程序中的观察者模式实现。这将帮助您清晰地理解观察者模式及其用法。

要求是创建一个销售仪表板网页,该网页可以附加多个销售报表。(我们将为每个报表创建 Web 用户控件)。报表的值取决于仪表板页面的产品选择。这是一个引入观察者模式的完美场景。

演练

步骤 1 - 要开始项目,请创建一个 ASP.NET Web 应用程序项目。

步骤 2 - 创建一个 Subject 类(DashboardPage),然后创建以下属性和方法

属性
  • List<IReport> _ReportCollection – 用于保存观察者列表
  • public string SelectedProduct – 选定的产品值
方法
  • Add(IReport module) – 添加观察者
  • Remove(IReport module) – 移除观察者
  • Update() – 此方法将更新所有依赖的观察者

Subject 类(DashboardPage)的完整代码如下:

   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);
        }
    } 
} 

DashboardPage 将充当所有子报表的主要主题。

步骤 3 - 创建一个 Observer 接口,并通过将 Subject 作为参数传递来添加 Update 方法定义。

Observer 接口的完整代码如下:

public interface  IReport
{
    void Update(DashboardPage page);
}  

注意创建 Observer 作为接口的原因是为了给派生类提供自行实现其功能的灵活性。

步骤 4 - 创建一个 SalesDashboard.aspx 网页,并让它继承自 DashboardPage 类。

步骤 5 - 将一个 Dropdownlist 控件拖放到 SalesDashboard.aspx 页面上,并绑定一些 string 值。绑定的值将是示例产品名称。在 Page.OnLoad 事件处理程序中,选定的值将被分配给 SelectedProduct 属性。

SalesDashboard.aspx 页面的完整代码如下:

public partial class SalesDashboard : DashboardPage
{
    protected override void OnLoad(EventArgs e) {
        SelectedProduct = this.DropDownList1.SelectedValue;
 
        Add(SalesReport11);
        Add(SalesReport21);
 
        base.OnLoad(e);
    }
 
    protected void Button1_Click(object sender, EventArgs e) {
        Update();
    }
}   

步骤 6 - 我们还需要创建 WebUserControls 作为观察者。创建两个 Web 用户控件,并将它们分别命名为 Report1 Report2

实现 IReport 接口,并按照如下方式编写 Update 方法的实现:

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

基本上,第一个报表将在标签控件中显示选定的 Product ,对于第二个报表,您可以编写自己的实现。

创建 Report1 Report2 WebUserControls 后,将它们拖放到 SalesDashboard.aspx 页面上。在代码隐藏文件中,将这些报表添加到页面的 ReportCollection 属性中,如下面的代码所示:

protected override void OnLoad(EventArgs e) {
      ………
 
        Add(SalesReport11);
        Add(SalesReport21);
 
        base.OnLoad(e);
    }
……………

步骤 7 - 在按钮点击事件中添加 Update 方法,然后运行 Web 应用程序。

您已在此处完成了 ASP.NET Web 应用程序中的观察者模式实现。当您单击按钮时,所有依赖的观察者都将通过获取在 Dashboard 页面(主题)上设置的值来更新。观察代码行为的最佳方法是调试代码。

技巧

您可以在页面加载时动态添加报表(观察者),通过验证其接口类型。但这会损害应用程序性能,网页是无状态的,每次页面加载时,它都必须遍历所有控件,然后绑定 IReport 接口类型的控件。因此,静态添加报表是最佳选择,而且它允许您在不修改底层代码的情况下轻松地在需要时添加/删除报表。

结论

观察者模式是软件模式家族中的一种行为模式。通过扩展观察者模式,可以极大地增加应用程序设计的灵活性。

历史

  • 2009 年 9 月 10 日:初稿
© . All rights reserved.