实现了观察者模式(c#)的对立面——父节点监视所有的子节点

本文关键字:监视 父节点 子节点 对立面 实现 观察者模式 | 更新日期: 2023-09-27 18:19:14

我刚开始学习c#中的观察者模式,我的要求正好与观察者模式相反:

我们有许多正在运行的进程和一个监控它们的进程。每个进程都可以(如果发生了某些事件)通知父进程。

似乎已经有这个问题"观察者模式的对立面是什么?"讨论了这个问题,但仍然没有代码示例。

为了理解观察者模式,我参考了下面由Jon Skeet编写的代码。

带委托的c#观察者/可观察对象的超级简单示例

      using System;
      class Observable
      {
          public event EventHandler SomethingHappened;
          public void DoSomething()
          {
          EventHandler handler = SomethingHappened;
          if (handler != null)
          {
            handler(this, EventArgs.Empty);
          }
      }


      class Observer
      {
          public void HandleEvent(object sender, EventArgs args)
          {
             Console.WriteLine("Something happened to " + sender);
          } 
      }

    class Test
    {
        static void Main()
        {
        Observable observable = new Observable();
        Observer observer = new Observer();
        observable.SomethingHappened += observer.HandleEvent;
        observable.DoSomething();
        }
    }

现在让我们假设只有一个观察者(父进程)和许多子进程。如何在c#的观察者模式中实现这一点?这个实现是否可以使用其他模式?

谢谢你的回答。

实现了观察者模式(c#)的对立面——父节点监视所有的子节点

你想解决什么问题?观察者模式是关于将观察者与观察者隔离开来,反之亦然,从而使您能够灵活地添加新的观察者,而无需修改观察者。只要在父进程中提供一个委托,让子进程在有趣的事件发生时触发。这是一个非常经典的适合观察者模式,所以我真的不明白你认为的与你的场景"相反"的地方。

你可能应该在启动子进程时传递委托,并让它们挂起引用。这样,您就不必为子进程提供找到父进程的机制,无论是通过操作系统、通过Singleton还是通过全局变量,这些选项中的任何一种都会破坏单元可测试性。

作为旁注,当观察者模式第一次被描述时,主流的OO语言并没有类似委托的功能。从本质上讲,委托是c#语言和。net平台中的观察者。