C#中利用代理实现观察者设计模式详解
界面开发中,经常使用观察者设计模式来实现文档/视图模式,当文档内容改变时,作为观察者的用户视图必须相应作出调整以向用户呈现文档的状态。由于语言机制的不同,观察者设计模式在不同的语言中实现方法也不尽相同。 先做如下假定: 参与观察者模式的三方分别为:发布者(数据/文档类)、订阅者(视图类)以及主窗体(MainForm),下面分别介绍各方如何实施以配合观察者模式的实现! 发布者: 复制代码 代码如下: 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) 在框架窗体类中分别生成发布者和订阅者的实例,然后将发布者实例赋值给订阅者的数据对象属性,由于C#中类的传递默认采用引用传递的方式,因此在赋值过程中并不生成临时对象,MainForm中的m_userData和View中的m_userData所指为同一对象。接下来在主窗体中改变发布者数据,通过C#的代理(delegate)机制,订阅者即能更新自己。 小结 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |