【转】通过 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");

                }

            }

        }

    }

}
原文地址:https://www.cnblogs.com/KevinJasmine/p/3604928.html