欢迎光临
我们一直在努力

IssuVision是怎样完成观察器模式的注册和通知的-.NET教程,评论及其它

建站超值云服务器,限时71元/月

众所周知,观察器(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事件发生时能同时通知多个观察器对象,而且是只通知定购了该消息的对象。同样,我们也很容易的为某个观察器对象定购或取消定购某个特定的消息。

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

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » IssuVision是怎样完成观察器模式的注册和通知的-.NET教程,评论及其它
分享到: 更多 (0)

相关推荐

  • 暂无文章