通过 INotifyPropertyChanged 实现观察者模式

原博客地址 http://frankdzu.blog.sohu.com/117654536.html

普通观察者模式存在的问题

我们都知道观察者模式的优点,可以在属性发生改变时,来监听一个实现好了的事件,这样可以帮助来异步处理 许多的事情,可是在观察者模式中,一般都是针对于实体来进行封装操作,可大多数的监听过程就需要写在实体的内部了,这样大大影响了实体封装的原子性,如果 想实现什么监听事件,都需要在实体层进行更改,这另人太不悦了```

不过,可以通过代理的方式,让实体里面监听的时候执行这个代理就好了,代理的功能由外部仍进来,不过这样也是破坏了实体本身,需要由外部来传递参数,这样对于底层开发人员来说,也不是很愉快的事情。

实现 INotifyPropertyChanged

怎么样才能既实现了监听,也不破坏实体的特性,让监听的事件外露呢?所以通过实现 INotifyPropertyChanged来解决这一问题。

  
原型:event PropertyChangedEventHandler PropertyChanged

下面这个例子将详细说明用法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel; namespace Demo
{
class Program
{
static void Main(string[] args)
{
// 创建实例 DemoCustomer demoCustomer = DemoCustomer.CreateNewCustomer(); // 实现事件触发需要处理的事情 demoCustomer.PropertyChanged += new PropertyChangedEventHandler(demoCustomer_PropertyChanged); // 更新值 引发事件 demoCustomer.PhoneNumber = ""; // 等待 Console.ReadLine();
} static void demoCustomer_PropertyChanged(object sender, PropertyChangedEventArgs e)
{ // 获取被更改的属性名 Console.WriteLine(e.PropertyName); // 获取最新更新的值 Console.WriteLine(((DemoCustomer)sender).PhoneNumber); }
} // 实现 INotifyPropertyChanged 接口 进行监听 public class DemoCustomer : INotifyPropertyChanged
{ // 默认的私有属性 private Guid idValue = Guid.NewGuid(); private string customerName = String.Empty; private string companyNameValue = String.Empty; private string phoneNumberValue = String.Empty; /// <summary> /// 在更改属性时引发的事件。(这个事件将被外露。) /// </summary> public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info)
{ if (PropertyChanged != null)
{ PropertyChanged(this, new PropertyChangedEventArgs(info)); } } // 默认的构造 private DemoCustomer()
{ customerName = "no data"; companyNameValue = "no data"; phoneNumberValue = "no data"; } // 简单的工厂模式 public static DemoCustomer CreateNewCustomer()
{ return new DemoCustomer(); } public Guid ID
{ get
{ return this.idValue; } } public string CompanyName
{ get
{ return this.companyNameValue; } set
{ if (value != this.companyNameValue)
{ this.companyNameValue = value; // 当发生改变时,那么就触发事件,传入触发的属性名 NotifyPropertyChanged("CompanyName"); } } } public string PhoneNumber
{ get
{ return this.phoneNumberValue; } set
{ if (value != this.phoneNumberValue)
{ this.phoneNumberValue = value; // 当发生改变时,那么就触发事件,传入触发的属性名 NotifyPropertyChanged("PhoneNumber"); } } } } }

最新文章

  1. python学习道路(day12note)(mysql操作,python链接mysql,redis)
  2. array_unshift() 、
  3. mysql用户的创建
  4. 小清新的jQuery ck-slide 图片轮播
  5. ajax请求成功或失败的参数
  6. 分页存储过程--From:桌面备份 -&gt; sql2005新功能.docx
  7. HDU 4720 Naive and Silly Muggles 2013年四川省赛题
  8. Stooge排序
  9. UITextField点击return后注销第一响应者
  10. Umbraco模型默认属性
  11. java学习之IO对象流
  12. 整理自百度知道提问的几道Java编程题
  13. Android在子线程中更新UI(二)
  14. MySQL常用命令总结2
  15. 【Android Developers Training】 73. 布局变化的动画
  16. React + Node 单页应用「二」OAuth 2.0 授权认证 &amp; GitHub 授权实践
  17. 四年级--python函数基础用法
  18. redis connection refused: connect 启动失败
  19. Python实现的各种机器学习算法
  20. iOS - 记住用户登录状态保存用户名密码

热门文章

  1. xtrabackup
  2. OpenStack实践系列⑥构建虚拟机实例
  3. Freeswitch 入门
  4. maven:打包时报错,报&rsquo;找不到符号&rsquo;
  5. 【原创】大叔经验分享(35)lzo格式支持
  6. [MySQL]InnoDB引擎的行锁和表锁
  7. Golang的优雅重启
  8. Float与二进制之间的转化(Java实现)
  9. kernel_size
  10. Web Penetration Testing w3af fierce