IssuVision是怎样完成观察器模式的注册和通知的
2004-06-13 16:06
369 查看
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
众所周知,观察器(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事件发生时能同时通知多个观察器对象,而且是只通知定购了该消息的对象。同样,我们也很容易的为某个观察器对象定购或取消定购某个特定的消息。
通过以上介绍,我想大家应该明白了观察器模式的注册和通知方法了吧?如果上面有错误或不足的地方还请大家斧正。
相关文章推荐
- java观察着observer模式---商品价格变动通知客户
- 立即获得下载任务完成的消息通知。Android DownloadManager通过注册一个广播监听系统的广播事件完成此操作,在创建广播时候,需要指明过滤器为:DownloadManager.ACTIO
- 设计模式怎样解决设计问题[笔记]
- 奇怪了:通知的委托方法必须在注册通知的 后边,除非有声明 ios6
- 任务和目标的区别,以及怎样完成任务、实现目标
- 登录注册mvp模式
- 【怎样写代码】确保对象的唯一性 -- 单例模式(三):单例模式
- 怎样使控件注册到VS2005 工具箱中(一)
- 【怎样写代码】确保对象的唯一性 -- 单例模式(五):一种更好的单例实现方法(静态内部类)
- 【设计模式 4】怎样写出更高逼格的单例模式
- MS SQL Server怎样在CMD命令行模式下工作:执行select,insert等等
- 教你怎样注册Google Market 帐号
- 微服务模式系列之七:自注册
- 对模式图及通知的理解
- 观察者模式--众多通知,一步到位(行为模式06)
- andriod———1.实现原生登录注册。 2.首页完成商品列表展示点击相对应的商品ID进入商品详情 3.商品详情页面展示数据,点击加入购物车进入购物车页面 4.购物车页面完成购物车编辑,删除,功能
- WebWork完成用户注册的例子
- 注册树模式
- 学习登录注册的简单完成。
- iOS开发- 界面传值(1)-通知模式(广播)