亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中利用代理實現觀察者設計模式詳解

2020-01-24 02:50:50
字體:
來源:轉載
供稿:網友

界面開發中,經常使用觀察者設計模式來實現文檔/視圖模式,當文檔內容改變時,作為觀察者的用戶視圖必須相應作出調整以向用戶呈現文檔的狀態。由于語言機制的不同,觀察者設計模式在不同的語言中實現方法也不盡相同。

在MFC的文檔/視圖模式中,每當文檔內容改變都需要調用UpdateAllView函數來更新視圖,該函數會遍歷文檔的每一個視圖,調用每個視圖的更新函數來更新視圖,為此文檔須登記每一個使用該文檔的視圖。C#中觀察者設計模式的實現也可以采用這種方法,但C#提供的代理(delegate)機制為實現觀察者模式提供了更好的方法,該方法和MFC中的方法類似 ,只不過將視圖向文檔注冊這一行為改變為為文檔類的代理生成實例而已,下面看具體實現方法。

先做如下假定:
1、文檔類為UserData;
2、視圖類為View,實際應用中該View可能是一個Form,也可能是一個UserControl,可能有多個視圖,但每一個和文檔的對應方式都是相同的;
3、主窗體為MainForm;

參與觀察者模式的三方分別為:發布者(數據/文檔類)、訂閱者(視圖類)以及主窗體(MainForm),下面分別介紹各方如何實施以配合觀察者模式的實現!

發布者:
發布者的任務是定義數據并在數據改變時通知訂閱者。通知的實現可以使用普通代理,也可以使用事件,首先在UserData中創建代理和事件,每一個事件在UserData類相應屬性改變時觸發,看下面的代碼:

復制代碼 代碼如下:

  public delegate void UserNameChangedEventHander(object sender, EventArgs e);   //聲明代理
  public event UserNameChangedEventHander NameChanged;   //聲明事件

  private string m_userName;
  public string UserName//定義屬性
  {
get
{
    return m_userName;
}
set
{
    if (m_userName != value)
    {
  m_userName = value;
  NameChanged(this, EventArgs.Empty);    //觸發事件
    }
}
  }

上述代碼首先聲明了代理,然后聲明了代理對應的事件(事件也算一種特殊的代理),這些代理實例的生成將在視圖中進行,然后在屬性的set函數中觸發事件,該事件將在各個訂閱者中得到響應。

訂閱者:
訂閱者的任務是響應發布者發布的數據改變通知,呈現給用戶實時(相對來說)的系統狀態。

看下面的代碼:

復制代碼 代碼如下:

 private UserData m_userData = null;   
  public UserData UserDataObj     //定義數據(文檔)對象
  {
get
{
    return m_userData;
}
set
{
    m_userData = (UserData)value;     //下面一行添加數據對象事件響應函數
    m_userData.NameChanged += new UserData.UserNameChangedEventHander(UserNameChanged); 
}
  }
  private void UserNameChanged(object sender,EventArgs e)    //定義數據對象事件響應函數
  {
this.tbName.Text = m_userData.UserName;//根據數據對象更新內容
this.Invalidate();     //重繪視圖
  }

上述代碼首先在視圖類中定義一數據對象屬性,并在屬性的set函數中添加對數據對象所發布通知的響應。接下來定義了響應數據對象通知的函數,在該函數中更新視圖數據并重繪。

主窗體:
主窗體的任務是定義一個相當于全局的數據對象,將其賦予每個訂閱該對象的視圖,并在需要的時候改變數據對象內容。

看下面的代碼:

復制代碼 代碼如下:

 private UserData m_userData;    //發布者
  private View m_view;//訂閱者

  private void MainForm_Load(object sender, EventArgs e)
  {
m_userData = new UserData(); //生成實例
m_view = new View();
m_view.UserDataObj = m_userData;     //為訂閱者指定發布者
m_view.Show();     //顯示
m_userData.UserName = "ZPY";    //改變發布者數據  
m_view.TopMost = true;
  } 


在框架窗體類中分別生成發布者和訂閱者的實例,然后將發布者實例賦值給訂閱者的數據對象屬性,由于C#中類的傳遞默認采用引用傳遞的方式,因此在賦值過程中并不生成臨時對象,MainForm中的m_userData和View中的m_userData所指為同一對象。接下來在主窗體中改變發布者數據,通過C#的代理(delegate)機制,訂閱者即能更新自己。

小結
MFC為開發者搭好了框架,盡管作了許多的開發,可能很多人還是不太了解什么是所謂的觀察者模式,C#提供了全開放的設計,可能辛苦些,但不再摸不著頭腦,條理感覺更清晰些,封裝性感覺也比MFC好些!

學習模式注重精髓而非模板,本文為了便于說明假定了三方并對三方功能進行了劃分,實際應用并不拘泥于此。如果情況合適將數據(文檔)類設計為單件模式也是一種很不錯的選擇!總之一句話:掌握精髓,盡情發揮!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品情侣自拍| 久久久久久久久爱| 91欧美精品午夜性色福利在线| 欧美日韩国产在线| 国产激情久久久久| 日韩中文字幕免费| 国产色综合天天综合网| 国产精品视频xxxx| 一区二区三区无码高清视频| 日韩中文字幕免费视频| 91av在线播放| 亚洲精品视频在线观看视频| 在线日韩第一页| 亚洲开心激情网| 538国产精品一区二区免费视频| 美女视频黄免费的亚洲男人天堂| 国产视频一区在线| 一个人www欧美| 国产69精品久久久久久| 国产成人激情视频| 亚洲精品一区二区网址| 国产成人av网址| 日本高清不卡的在线| 久久精品视频中文字幕| 亚洲最新视频在线| 欧美成人激情视频| 亚洲电影第1页| 日韩免费黄色av| 欧美性开放视频| 国产精品1区2区在线观看| 国产精品女人久久久久久| 午夜精品久久久久久久99热浪潮| 日韩欧美中文字幕在线播放| 亚洲精品久久久久久下一站| 久久精品夜夜夜夜夜久久| 日韩亚洲精品视频| 国产91露脸中文字幕在线| 国产日韩在线看| 亚洲精品少妇网址| 国产精品久久久久高潮| 欧美午夜精品久久久久久人妖| 亚洲一区二区福利| 欧美日韩免费在线| 亚洲精品丝袜日韩| 伦伦影院午夜日韩欧美限制| 97视频在线观看亚洲| 91亚洲国产成人久久精品网站| 一本色道久久综合狠狠躁篇怎么玩| 国内外成人免费激情在线视频网站| 国产精品高清网站| 欧美大尺度激情区在线播放| 欧美激情亚洲国产| 欧美猛男性生活免费| 精品久久香蕉国产线看观看gif| 亚洲国产精品人人爽夜夜爽| 美日韩精品免费视频| 欧美亚洲在线播放| 91精品免费久久久久久久久| 久久99久久99精品中文字幕| 精品久久香蕉国产线看观看亚洲| 欧美日韩国产激情| 成人免费直播live| 色中色综合影院手机版在线观看| 在线成人中文字幕| 美女国内精品自产拍在线播放| 国产精品视频一| 亚洲一区二区免费在线| 国产精品国产三级国产专播精品人| 91在线视频成人| 亚洲最新中文字幕| 色偷偷偷亚洲综合网另类| 亚洲精品福利视频| 国产精品成久久久久三级| 亚洲娇小xxxx欧美娇小| 日韩国产高清污视频在线观看| 美女撒尿一区二区三区| 久久九九国产精品怡红院| 亚洲一区二区三区香蕉| 亚洲伊人一本大道中文字幕| 91在线无精精品一区二区| 国产精品福利观看| 91精品久久久久久综合乱菊| 欧美高清电影在线看| 亚洲最新中文字幕| 欧美激情亚洲自拍| 国外成人免费在线播放| 亚洲性生活视频| 日韩影视在线观看| 欧美主播福利视频| 国产精品一区二区三区久久| 欧美亚洲视频一区二区| 中文在线资源观看视频网站免费不卡| 国产成人avxxxxx在线看| 欧美午夜久久久| 欧美国产一区二区三区| 日本成人免费在线| 久久中国妇女中文字幕| 国产精品女人网站| 九色成人免费视频| 欧美日韩免费在线| 国内揄拍国内精品| 久久99精品久久久久久琪琪| 九九精品在线播放| 69**夜色精品国产69乱| 91大神在线播放精品| 亚洲精品国产suv| 欧美黑人xxxⅹ高潮交| 国产在线一区二区三区| 91午夜理伦私人影院| 欧美日韩中文字幕在线视频| 日韩av影视在线| 91亚洲国产成人精品性色| 亚洲精品小视频在线观看| 成人亚洲综合色就1024| 日韩免费在线看| 亚洲免费成人av电影| 日韩欧美成人免费视频| 欧美日韩一区二区免费在线观看| 在线成人免费网站| 国产成+人+综合+亚洲欧洲| 亚洲福利小视频| 久久99精品久久久久久噜噜| 中文字幕在线视频日韩| 欧美视频在线观看 亚洲欧| 国产亚洲精品日韩| 国产精品亚洲欧美导航| 欧美裸体xxxx| 亚洲欧美精品伊人久久| 国产视频观看一区| 九九精品在线播放| 国产精品久久久久久久久久免费| 日韩av成人在线观看| 欧美大全免费观看电视剧大泉洋| 欧美色欧美亚洲高清在线视频| www亚洲精品| 国产成人亚洲综合青青| 国产精品免费久久久久久| 91在线|亚洲| 91av在线免费观看视频| 国产日韩欧美电影在线观看| 在线亚洲欧美视频| 亚洲娇小xxxx欧美娇小| 日韩欧美中文第一页| 日韩欧美在线播放| 国产精品久久久久久久久久久不卡| 中文字幕亚洲综合久久筱田步美| 国产91九色视频| 久久人人爽人人爽人人片亚洲| 欧美一级高清免费| 欧美中文字幕在线视频| 日韩激情片免费| xvideos国产精品| 成人久久一区二区三区| 亚洲一区二区国产| 国产精品99一区| 亚洲自拍小视频| 久久精品国产亚洲| 55夜色66夜色国产精品视频| 日韩av手机在线| 国外成人在线直播| 国产一区二区美女视频| 久久久久久久久久久国产| 国语自产精品视频在线看| 77777亚洲午夜久久多人|