ASP.NET 中的观察者模式





4.00/5 (4投票s)
本文将向您展示如何在 ASP.NET 应用程序中使用观察者模式。
引言
本文将向您展示如何在 ASP.NET 应用程序中使用观察者模式。
什么是观察者模式?
观察者模式是一种行为模式,它允许对象之间存在一对多的依赖关系,当一个对象的状态发生变化时,所有依赖的对象都会自动收到通知并更新。下图将展示观察者模式的类层次结构。典型的仪表板网页可以作为观察者模式实现的绝佳示例。设想一个带有多个报表的销售仪表板网页。当仪表板页面中的任何值发生变化时,所有相关的报表都应该相应地更改/更新。观察者模式允许动态地向仪表板页面添加/删除报表,从而使其独立运行。下图将为您提供观察者模式类层次结构的详细视图。
 
 
实现
为了彻底理解观察者模式,请遵循以下 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 日:初稿


