Windows 控件的观察者设计模式






1.24/5 (10投票s)
2006年2月3日
2分钟阅读

39488

414
本文档的目的是为 Windows 控件实现观察者模式,当一个 MDI 子窗体的数据发生变化时,如何让其他已注册的窗体通知这些变化。
引言
我正在开发一个医疗保健项目,在这个项目中我发现相同的信息可以从多个 MDI 子窗体中输入。但是,如果同时打开了两个可以添加相同信息的窗体,那么如果用户在一个窗体上的控件中添加了一些数据,它不会在另一个打开的窗体的相关控件中更新。
因此,我找到了一种简单但非常实用的解决方案。它实现了两种主要的设计模式:1) 单例模式 2) 观察者模式,这两种模式都帮助我完成了任务,而且我认为对大家也可能有用。
问题陈述
现在,在演示应用程序中,我在三个窗体上都有数据网格控件。现在我希望如果在一个窗体上的网格中添加或删除数据,它也应该从其他两个网格中删除(如果窗体已创建)。
解决方案
我提出了一种简单的解决方案,我创建了一个新的 MDI 应用程序。然后我创建了三个子窗体,每个窗体都包含一个数据网格和一个工具栏,用于添加/删除行。所有三个子窗体都继承自 FrmParent,FrmParent 又继承自 windows.Forms.Form。FrmParent 具有一个公共可重写的方法 "Update",该方法由观察者类调用以更新更改。
观察者类是单例模式和观察者设计模式的结合。它有四种方法:
1) Public Shared Function Instance() As Observer
这是一个共享方法,返回类的单例对象。
2) Public Sub Add(ByVal form As FrmParent)
此方法将窗体添加到 ArrayList 中。
3) Public Sub Notify(ByVal row As DataRow, ByVal op As FrmParent.Operation)
此方法通知已注册的窗体获取更新。
4) Public Sub Release(ByVal form As FrmParent)
在窗体关闭时,调用此方法将窗体从观察者类的 ArrayList 中释放。
注意: 在应用程序中打开所有三个窗体,然后开始数据输入,否则新添加的数据会生效,但先前的数据不会在新窗体上显示。