通过 INotifyPropertyChanged 实现观察者模式

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

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

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

实现 INotifyPropertyChanged

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

原型:event PropertyChangedEventHandler PropertyChanged

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

using System;

using System.Collections.Generic;

using System.Text;

using System.ComponentModel;

 

namespace Demo

{

class Program

{

public static void Main(string[] args)

{

// 创建实例

DemoCustomer demoCustomer = DemoCustomer.CreateNewCustomer();

// 实现事件触发需要处理的事情

demoCustomer.PropertyChanged += new PropertyChangedEventHandler(demoCustomer_PropertyChanged);

// 更新值 引发事件

demoCustomer.PhoneNumber = "100";

// 等待

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(thisnew 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");

}

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值