.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
IssuVision是怎样完成观察器模式的注册和通知的

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

 

 

    众所周知,观察器(Observer)模式的重点是对观察器对象的注册以及Subject状态改变时对观察器对象的消息通知。那么,在IssuVision(微软智能客户端的示例程序)中是如何实现这一点的哪?在此,我提出自己的看法,希望大家批评指正。

    在IssuVision中,系统定义了一个IssueSubject类,该类实现了Isubject接口,同时各观察器对象都实现了Iobserver接口,该接口包括了一个Isubject对象。注册和事件等级是在这里完成的:

m_issueSubject = new IssueSubject(this.components);

 

           paneStaff.Subject = m_issueSubject;

           paneMiddle.Subject = m_issueSubject;

           paneRight.Subject = m_issueSubject;

           paneChart.Subject = m_issueSubject;

           paneConflict.Subject = m_issueSubject;

 

系统先创建了一个IssueSubject类的实例,然后让所有的观察器对象共享这个实例,这样就完成了注册。但是,事情还没有完,我们深入Subject的注册操作,看看里面究竟发生了什么:

paneMiddle的注册:

public ISubject Subject

       {

           set

           {

               m_subject = (IssueSubject)value;

               issueList.Subject = m_subject;

               m_subject.IssueDataChanged += new IssueSubject.IssueDataChangedEventHandler(this.Subject_IssueDataChanged);

           }

       }

 

paneRight的注册

public ISubject Subject

       {

           set

           {

               m_subject = (IssueSubject)value;

               m_subject.PositionChanged += new IssueSubject.PositionChangedEventHandler(this.Subject_PositionChanged);

               m_subject.IssueDataChanged += new IssueSubject.IssueDataChangedEventHandler(this.Subject_IssueDataChanged);

           }

       }

在这两个注册里,m_subject都指向了同一个IssueSubject对象,这能保证他们共享相同的数据源,同时把IssueSubject对象的事件处理程序挂接到了本观察器的成员方法中。这就保证了IssueSubject对象触发事件时,能够把消息通知到本观察器。更进一步,大家再看一下这两个注册方法里的两行代码:

m_subject.IssueDataChanged += new IssueSubject.IssueDataChangedEventHandler(this.Subject_IssueDataChanged);

 

m_subject.IssueDataChanged += new IssueSubject.IssueDataChangedEventHandler(this.Subject_IssueDataChanged);

 

在这里,m_subject.IssueDataChange事件对应了两个事件响应方法,这就保证了IssueDataChange事件发生时能同时通知多个观察器对象,而且是只通知定购了该消息的对象。同样,我们也很容易的为某个观察器对象定购或取消定购某个特定的消息。

 

通过以上介绍,我想大家应该明白了观察器模式的注册和通知方法了吧?如果上面有错误或不足的地方还请大家斧正。




相关文章

相关软件