C#中應用署理完成不雅察者設計形式詳解。本站提示廣大學習愛好者:(C#中應用署理完成不雅察者設計形式詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中應用署理完成不雅察者設計形式詳解正文
界面開辟中,常常應用不雅察者設計形式來完成文檔/視圖形式,當文檔內容轉變時,作為不雅察者的用戶視圖必需響應作出調劑以向用戶出現文檔的狀況。因為說話機制的分歧,不雅察者設計形式在分歧的說話中完成辦法也不盡雷同。
在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好些!
進修形式重視精華而非模板,本文為了便於解釋假定了三方並對三方功效停止了劃分,現實運用其實不拘泥於此。假如情形適合將數據(文檔)類設計為單件形式也是一種很不錯的選擇!總之一句話:控制精華,縱情施展!