在面向对象设计模式中,观察者模式是一种被广泛使用的设计模式。这种模式定义了对象之间的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。
观察者模式的主要参与者有两个:主题(Subject)和观察者(Observer)。主题维护一个观察者列表,并有一个添加观察者和删除观察者的方法。当主题状态变化时,它将通知所有观察者。观察者则是一个接口,它定义了一个更新方法,这个方法将被主题用来通知观察者。
C#语言提供了内置的观察者模式支持,通过`System.ComponentModel`命名空间下的`INotifyPropertyChanged`接口和`PropertyChanged`事件来实现。
下面是一个简单的示例来说明如何在C#中使用观察者模式。在这个例子中,我们将创建一个`Person`类和一个`AddressBook`类。当`Person`对象的地址发生变化时,所有的`AddressBook`对象都将得到通知。
```csharp
using System.Collections.ObjectModel;
using System.ComponentModel;
public class Person : INotifyPropertyChanged
{
private string address;
public event PropertyChangedEventHandler? PropertyChanged;
public string Address
{
get => this.address;
set
{
if (this.address != value)
{
this.address = value;
this.NotifyPropertyChanged("Address");
}
}
}
private void NotifyPropertyChanged(string propertyName)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class AddressBook
{
private ObservableCollection people;
public AddressBook()
{
this.people = new ObservableCollection();
this.people.CollectionChanged += this.OnPeopleChanged;
}
private void OnPeopleChanged(object sender, NotifyCollectionChangedEventArgs e)
{
foreach (var person in this.people)
{
person.PropertyChanged += this.OnAddressChanged;
}
}
private void OnAddressChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Address")
{
Console.WriteLine($"The address of a person has changed!");
}
}
}
```
在这个例子中,我们首先创建了一个`Person`类,这个类实现了`INotifyPropertyChanged`接口,并定义了一个`Address`属性。当这个属性的值改变时,我们将调用`NotifyPropertyChanged`方法来触发`PropertyChanged`事件。
然后我们创建了一个`AddressBook`类,这个类包含一个`ObservableCollection`集合。当这个集合的元素发生更改时,我们的`OnPeopleChanged`方法将被调用。在这个方法中,我们为每个`Person`对象注册了`PropertyChanged`事件。
我们的`OnAddressChanged`方法将在每个`Person`的地址发生更改时被调用。在这个方法中,我们打印出一条消息,表示有人的地址发生了更改。
以上就是C#中观察者模式的基本应用。在实际开发中,我们可以利用这种模式来减少代码的耦合度,使得各个模块更加独立。