logo

C# 中基于事件的观察者模式详解与实践

作者:搬砖的石头2024.01.18 11:40浏览量:9

简介:本文将深入探讨C#中基于事件的观察者模式,解释其工作原理,并通过实际示例展示如何实现和应用这种设计模式。

观察者模式是一种软件设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。在C#中,我们常常使用事件来实现这种观察者模式。

1. 工作原理

基于事件的观察者模式主要包括三个部分:

  • 主题(Subject):这是被观察的对象,当其状态发生变化时,会通知所有注册的观察者。
  • 观察者(Observer):这是观察主题的对象,它们订阅主题的事件,以便在主题状态发生变化时得到通知。
  • 事件(Event):这是连接主题和观察者的纽带,当主题的状态发生变化时,事件将被触发,并通知所有注册的观察者。

    2. C# 中的实现

    在C#中,我们可以使用System.ComponentModel.INotifyPropertyChanged接口和System.Events.EventHandler委托来实现基于事件的观察者模式。

    2.1 INotifyPropertyChanged 接口

    INotifyPropertyChanged接口允许一个类通知其他类,当某个属性值发生变化时。实现这个接口的类需要定义一个OnPropertyChanged方法,该方法接受一个字符串参数,表示发生变化的属性的名称。
    1. public interface INotifyPropertyChanged
    2. {
    3. event PropertyChangedEventHandler PropertyChanged;
    4. void OnPropertyChanged(string propertyName);
    5. }

    2.2 EventHandler 委托

    EventHandler委托用于表示事件,它接受两个参数:一个object类型的sender和一个EventArgs类型的e。在事件处理程序中,我们通常使用匿名方法或者Lambda表达式来处理事件。
    1. public delegate void EventHandler(object sender, EventArgs e);

    3. 示例应用

    下面是一个简单的例子,展示如何使用基于事件的观察者模式来更新UI。假设我们有一个简单的窗口应用程序,其中有一个文本框和一个按钮。当按钮被点击时,文本框的内容将发生变化。

    3.1 定义主题(ViewModel)

    首先,我们创建一个ViewModel类,该类实现了INotifyPropertyChanged接口。这个类有一个Text属性,以及一个OnPropertyChanged方法。当Text属性发生变化时,我们将调用OnPropertyChanged方法并传入属性名称,以触发事件。
    1. public class ViewModel : INotifyPropertyChanged
    2. {
    3. private string _text;
    4. public string Text
    5. {
    6. get => _text;
    7. set
    8. {
    9. _text = value;
    10. OnPropertyChanged(nameof(Text));
    11. }
    12. }
    13. public event PropertyChangedEventHandler PropertyChanged;
    14. protected virtual void OnPropertyChanged(string propertyName)
    15. {
    16. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    17. }
    18. }

相关文章推荐

发表评论