使用事件实现观察者模式 (C#)






4.50/5 (5投票s)
本文提供了一个使用事件实现观察者模式的基本模板。
引言
本文提供了一个使用 event
实现观察者模式的基本模板。本文旨在简洁地与您分享如何使用事件实现观察者模式,通过呈现执行此操作所需的最低限度的代码。请随时修改此模板以适应您的项目需求。
为了增强您的学习体验,您可以从 这里 下载一个控制台项目并阅读本文时进行实验。
背景
观察者模式通常以两种方式实现
- 我们创建自己的主题/观察者抽象和实现(例如,创建
ISubject
、IObservable
和相关的派生类) - 我们让我们的主题/观察者从
IObservable<T>
和IObserver<T>
继承
虽然这些是最流行的实现方式,我们也可以考虑另一种实现方式:使用 events
。
Using the Code
有两个必要的类:Subject
类和 Observer
类。
主题
subject
包含事件字段并可以引发事件。
public class Subject
{
public event EventHandler eventHandler; //We can also consider
//using an auto-implemented property instead of a public field
public void NotifyObservers()
{
if (eventHandler != null) //Ensures that if there are no handlers,
//the event won't be raised
{
eventHandler(this, EventArgs.Empty); //We can also replace
//EventArgs.Empty with our own message
}
}
}
注释
- 包含事件:
public event EventHandler eventHandler;
这是将subject
和observer
s 结合在一起的粘合剂 - 引发事件:
eventHandler(this, EventArgs.Empty);
所有订阅此事件的观察者将收到事件已引发的通知
观察者
observer
可以订阅和取消订阅 subject
。它还会在 subject
的事件上附加一个处理程序。
public class Observer
{
Subject subject;
public Observer(Subject subject)
{
this.subject = subject;
}
public void Subscribe()
{
subject.eventHandler += DoSomething; //Every time the event is raised
//(from eventHandler(this,EventArgs.Empty);), DoSomething(...) is called
}
public void UnSubscribe()
{
subject.eventHandler -= DoSomething; //Now, when the event is raised,
//DoSomething(...) is no longer called
}
private void DoSomething(object sender, EventArgs e)
{
Console.WriteLine("This Observer instance has received
a notification from its associated Subject.");
}
}
注释
- 包含事件处理程序:
private void DoSomething(object sender, EventArgs e) {...}
当Subject's eventHandler
被引发时,会调用此处理程序。 - 通过将处理程序附加到
Subject's eventHandler: subject.eventHandler += DoSomething
来订阅。我们也可以多次订阅。 - 通过从
subject's eventHandler: subject.eventHandler -= DoSomething
中分离处理程序来取消订阅。
Main
我们在 Main
方法中运行我们的观察者模式
class Program
{
static void Main(string[] args)
{
Subject subject = new Subject();
Observer observer1 = new Observer(subject);
Observer observer2 = new Observer(subject);
//subscribe the Observer instances to "subject"
observer1.Subscribe();
observer2.Subscribe();
subject.NotifyObservers(); //both Observer instances'
//DoSomething(object sender, EventArgs e) method are called
observer1.UnSubscribe();
subject.NotifyObservers(); //only observer2's DoSomething(object sender, EventArgs e)
//method is called because observer2 has unsubscribed from "subject"
Console.ReadKey();
}
}
注释
- 由于我们已经取消订阅了
observer1,
我们的控制台输出的语句“This Observer instance has received a notification from its associated Subject.” 三次而不是四次。
延伸阅读
- 在 .NET 中实现观察者模式 (3 种技术)
- 探索观察者设计模式
- 面向 .NET 和 C# 开发人员的响应式编程 - 简介 IEnumerable、IQueryable、IObservable 和 IQbservable
感谢您的阅读!希望本文能帮助您学习另一种在 C# 中实现观察者模式的方法。如果您有任何意见,请随时在下方分享。