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 日:初稿