【转】通过 INotifyPropertyChanged 实现观察者模式
通过 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"); } } } } }
【转】通过 INotifyPropertyChanged 实现观察者模式的更多相关文章
- 通过 INotifyPropertyChanged 实现观察者模式
INotifyPropertyChanged 它的作用:向客户端发出某一属性值已更改的通知. 当属性改变时,它可以通知客户端,并进行界面数据更新.而我们不用写很多复杂的代码来更新界面数据,这样可以做到 ...
- 观察者模式实现INotifyPropertyChanged
其实一直不知道INotifyPropertyChanged这个接口中PropertyChanged事件是什么时候有值的,因为在使用的时候,只要按步骤来就可以,因为我自己并没有对这个事件赋值,所以很好奇 ...
- C#-INotifyPropertyChanged(解决数据绑定的界面刷新问题)
最近做项目用到DataGridView,用它绑定数据源后,如果数据源中的数据修改无法及时刷新到控件上,必须切换单元格的焦点才能导致刷新显示新数值,通过查官方文档,用INotifyPropertyCha ...
- WPF学习总结1:INotifyPropertyChanged接口的作用
在代码中经常见到这个接口,它里面有什么?它的作用是什么?它和依赖属性有什么关系? 下面就来总结回答这三个问题. 1.这个INotifyPropertyChanged接口里就一个PropertyChan ...
- 23种设计模式--观察者模式-Observer Pattern
一.观察者模式的介绍 观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项 ...
- 谈谈JS的观察者模式(自定义事件)
呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...
- ObserverPattern(观察者模式)
import java.util.ArrayList; import java.util.List; /** * 观察者模式 * @author TMAC-J * 牵一发而动全身来形容观察者模式在合适 ...
- java观察者模式
像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...
- Backbone源码解析(六):观察者模式应用
卤煮在大概一年前写过backbone的源码分析,里面讲的是对一些backbone框架的方法的讲解.这几天重新看了几遍backbone的源码,才发现之前对于它的理解不够深入,只关注了它的一些部分的细节和 ...
随机推荐
- Spring 邮件发送
前言:以前都是直接用Java自带的邮件工具发送邮件,现在Spring帮我们做了封装,提供了更好用更简单的发送邮件工具JavaMailSender 关于邮件服务器的设置就不在这里说了,直接去QQ邮箱 ...
- 洛谷P5219 无聊的水题 I [prufer序列,生成函数,NTT]
传送门 思路 有标号无根树的计数,还和度数有关,显然可以想到prufer序列. 问题就等价于求长度为\(n-2\),值域为\([1,n]\),出现次数最多的恰好出现\(m-1\)次,这样的序列有哪些. ...
- js-DOM事件
var EventUtil = { addHandler:function(elm,type,handler){//添加事件 if(elm.addEventListener){ elm.addEven ...
- swift 学习- 13 -- 下标
// 下标 可以定义在 类, 结构体, 和 枚举 中, 是访问集合, 列表或 序列中元素的快捷方式, 可以使用下标的索引, 设置 和 获取值, 而不需要再调用对应的存取方法, 举例来说, 用下标访问一 ...
- Modbus库开发笔记之五:Modbus RTU Slave开发
Modbus在串行链路上分为Slave和Master,这一节我们就来开发Slave.对于Modbus RTU从站来说,需要实现的功能其实与Modbus TCP的服务器端是一样的.其操作过程也是一样的. ...
- Idea-Java接入银联支付的Demo
注:本文来源于:< Idea-Java接入银联支付的Demo > 接入银联支付的Demo,希望能给大家节约一点时间 https://github.com/wangfei0904306/un ...
- Oracle 高水位说明和释放表空间,加快表的查询速度
高水位的介绍 数据库运行了一段时间,经过一些列的删除.插入.更改操作有些表的高水位线就有可能和实际的表存储数据的情况相差特别多,为了提高检索该表的效率,建议对这些表进行收缩: 查找高水位线的表 查找表 ...
- Confluence 6 PostgreSQL 输入你的数据库细节
在 Confluence 的设置安装向导中,将会指导你 Confluence 如何连接到你的数据库.请确定选择 "My own database". 使用 JDBC 连接(默认) ...
- Confluence 6 使用 CSS 样式化 Confluence 的介绍
这个页面对 Confluence 通过修改 CSS 来改变外观和感觉的情况进行了说明. 层叠样式表(Cascading Style Sheets (CSS))是对 Web 页面进行样式化的工业化标准. ...
- Python查找最新测试报告到邮件功能
#coding=utf-8 import smtplib from email.mime.text import MIMEText import unittest import HTMLTestRun ...