訂閱者的任務(wù)是響應(yīng)發(fā)布者發(fā)布的數(shù)據(jù)改變通知c實現(xiàn)觀察者模式,呈現(xiàn)給用戶實時(相對來說)的系統(tǒng)狀態(tài)。
看下面的代碼:
復(fù)制代碼 代碼如下:
= null;
//定義數(shù)據(jù)(文檔)對象
{
get
{
;
}
set
{
= ()value; //下面一行添加數(shù)據(jù)對象事件響應(yīng)函數(shù)
. += new .();
}
}
void ( , e) //定義數(shù)據(jù)對象事件響應(yīng)函數(shù)
{
this..Text = .;//根據(jù)數(shù)據(jù)對象更新內(nèi)容
this.(); //重繪視圖
}
上述代碼首先在視圖類中定義一數(shù)據(jù)對象屬性,并在屬性的set函數(shù)中添加對數(shù)據(jù)對象所發(fā)布通知的響應(yīng)。接下來定義了響應(yīng)數(shù)據(jù)對象通知的函數(shù),在該函數(shù)中更新視圖數(shù)據(jù)并重繪。
主窗體:
主窗體的任務(wù)是定義一個相當(dāng)于全局的數(shù)據(jù)對象,將其賦予每個訂閱該對象的視圖,并在需要的時候改變數(shù)據(jù)對象內(nèi)容。
看下面的代碼:
復(fù)制代碼 代碼如下:
; //發(fā)布者
View ;//訂閱者
void ( , e)
{
= new (); //生成實例
= new View();
. = ; //為訂閱者指定發(fā)布者
.Show(); //顯示
. = "ZPY"; //改變發(fā)布者數(shù)據(jù)
. = true;
}
在框架窗體類中分別生成發(fā)布者和訂閱者的實例,然后將發(fā)布者實例賦值給訂閱者的數(shù)據(jù)對象屬性,由于C#中類的傳遞默認(rèn)采用引用傳遞的方式c實現(xiàn)觀察者模式,因此在賦值過程中并不生成臨時對象,中的和View中的所指為同一對象。接下來在主窗體中改變發(fā)布者數(shù)據(jù),通過C#的代理()機(jī)制,訂閱者即能更新自己。
小結(jié)
MFC為開發(fā)者搭好了框架,盡管作了許多的開發(fā),可能很多人還是不太了解什么是所謂的觀察者模式,C#提供了全開放的設(shè)計,可能辛苦些,但不再摸不著頭腦,條理感覺更清晰些,封裝性感覺也比MFC好些!
學(xué)習(xí)模式注重精髓而非模板,本文為了便于說明假定了三方并對三方功能進(jìn)行了劃分,實際應(yīng)用并不拘泥于此。如果情況合適將數(shù)據(jù)(文檔)類設(shè)計為單件模式也是一種很不錯的選擇!總之一句話:掌握精髓,盡情發(fā)揮!
設(shè)計模式詳解教程觀察者代理利用
相關(guān)文章: