【问题标题】:Monitoring other classes with one class用一个类监控其他类
【发布时间】:2012-11-09 05:05:25
【问题描述】:

我有一个名为 DataClass 的类。这个类负责将信息保存在数据库中,在这个类中有一些保存和读取数据库的方法,除了这个类,我还有其他类叫做 HTMLEditor、QueryBuilder、EmailSending、InforDetails。 我需要通过我的数据类收听其他类,只要他们的信息发生更改,我的数据类就会被通知保存这些信息。 我知道有一种设计模式叫做观察者设计模式,在这种设计模式下,其他类(观察者)正在监听一个类(主题),只要主题的状态发生变化,就会通知其他观察者。

这个问题我该怎么办?这种情况有什么设计模式吗?

【问题讨论】:

    标签: c# oop design-patterns


    【解决方案1】:

    如果INotifyPropertyChanged,我认为你寻求的接口。

    Microsoft Documentation: INotifyPropertyChanged

    实现非常简单。

    set 你所做的每个属性中:

    public bool MyProperty
    {
        get { return myField; }
    
        set
        {
            if (myField != value)
            {
                myField= value;
                NotifyPropertyChanged();
            }
        }
    }
    

    以及方法和事件:

    public event PropertyChangedEventHandler PropertyChanged;
    
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    每个观察者只需要注册到那个事件,当一个属性发生变化时他们会得到一个反馈,以及哪个发生了。

    此外,当您向某些控件(如 PropertyGrid)提供实现该接口的对象时,它们会自动注册自己。

    【讨论】:

    • 谢谢,您的解决方案在一个类中有效,如何将其扩展到其他类?
    • @PersianGolf:“其他类”是什么意思?不能修改的类中的其他类?
    • 在其他类中如果某些属性发生变化,那么应该通知我的DataClass做一些动作,就像保存一样。
    • @PersianGolf:那么在你想监控的所有类中实现那个接口?
    • 此解决方案适用于内部通知(在每个班级中),我需要班级之间的通知。
    【解决方案2】:

    INotifyPropertyChanged 接口可能就是您所追求的:

    请看这里:http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

    您基本上订阅了其他类中的事件,并且这些类会在属性更改时引发事件。

    另外,这个 SO 问题的答案很酷:Automatically INotifyPropertyChanged

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多