• 【转】通过 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 = "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(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");
    
                    }
    
                }
    
            }
    
        }
    
    }
  • 相关阅读:
    任务墙(6月3日)
    燃尽图(6月3日)
    6.1-6.2小结
    5月28日任务进展
    个人感悟
    代码评审
    如何用ZBrush确定头部五官的位置
    ZBrush中的纹理-水手该怎样进行绘制
    怎样对ZBrush中的材料进行渲染和着色
    快速熟悉Zbrush中的四种裁切笔刷
  • 原文地址:https://www.cnblogs.com/KevinJasmine/p/3604928.html
Copyright © 2020-2023  润新知