IssuVision是怎么完成觀察器模式的注冊與通知的
發(fā)表時(shí)間:2023-07-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]眾所周知,觀察器(Observer)模式的重點(diǎn)是對觀察器對象的注冊以及Subject狀態(tài)改變時(shí)對觀察器對象的消息通知。那么,在IssuVision(微軟智能客戶端的示例程序)中是如何實(shí)現(xiàn)這一點(diǎn)的哪?...
眾所周知,觀察器(Observer)模式的重點(diǎn)是對觀察器對象的注冊以及Subject狀態(tài)改變時(shí)對觀察器對象的消息通知。那么,在IssuVision(微軟智能客戶端的示例程序)中是如何實(shí)現(xiàn)這一點(diǎn)的哪?在此,我提出自己的看法,希望大家批評指正。
在IssuVision中,系統(tǒng)定義了一個(gè)IssueSubject類,該類實(shí)現(xiàn)了Isubject接口,同時(shí)各觀察器對象都實(shí)現(xiàn)了Iobserver接口,該接口包括了一個(gè)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;
系統(tǒng)先創(chuàng)建了一個(gè)IssueSubject類的實(shí)例,然后讓所有的觀察器對象共享這個(gè)實(shí)例,這樣就完成了注冊。但是,事情還沒有完,我們深入Subject的注冊操作,看看里面究竟發(fā)生了什么:
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);
}
}
在這兩個(gè)注冊里,m_subject都指向了同一個(gè)IssueSubject對象,這能保證他們共享相同的數(shù)據(jù)源,同時(shí)把IssueSubject對象的事件處理程序掛接到了本觀察器的成員方法中。這就保證了IssueSubject對象觸發(fā)事件時(shí),能夠把消息通知到本觀察器。更進(jìn)一步,大家再看一下這兩個(gè)注冊方法里的兩行代碼:
m_subject.IssueDataChanged += new IssueSubject.IssueDataChangedEventHandler(this.Subject_IssueDataChanged);
m_subject.IssueDataChanged += new IssueSubject.IssueDataChangedEventHandler(this.Subject_IssueDataChanged);
在這里,m_subject.IssueDataChange事件對應(yīng)了兩個(gè)事件響應(yīng)方法,這就保證了IssueDataChange事件發(fā)生時(shí)能同時(shí)通知多個(gè)觀察器對象,而且是只通知定購了該消息的對象。同樣,我們也很容易的為某個(gè)觀察器對象定購或取消定購某個(gè)特定的消息。
通過以上介紹,我想大家應(yīng)該明白了觀察器模式的注冊和通知方法了吧?如果上面有錯(cuò)誤或不足的地方還請大家斧正。