65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (5投票s)

2016年3月12日

CPOL

2分钟阅读

viewsIcon

33107

本文提供了一个使用事件实现观察者模式的基本模板。

引言

本文提供了一个使用 event 实现观察者模式的基本模板。本文旨在简洁地与您分享如何使用事件实现观察者模式,通过呈现执行此操作所需的最低限度的代码。请随时修改此模板以适应您的项目需求。

为了增强您的学习体验,您可以从 这里 下载一个控制台项目并阅读本文时进行实验。

背景

观察者模式通常以两种方式实现

  1. 我们创建自己的主题/观察者抽象和实现(例如,创建 ISubjectIObservable 和相关的派生类)
  2. 我们让我们的主题/观察者从 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; 这是将 subjectobservers 结合在一起的粘合剂
  • 引发事件: 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.” 三次而不是四次。

延伸阅读

感谢您的阅读!希望本文能帮助您学习另一种在 C# 中实现观察者模式的方法。如果您有任何意见,请随时在下方分享。

© . All rights reserved.