C# 基于事件的观察者模式

观察者模式是一种软件设计模式,用于定义对象之间的一对多依赖关系,当一个对象的状态发生变化时,它的所有依赖者(观察者)都将得到通知并自动更新。这种模式通过解耦合主题和观察者来提高对象的灵活性。

定义
观察者模式包括一个主题(Subject)和多个观察者(Observer)。当主题的状态改变时,它会通知观察者并调用它们的特定方法,使得观察者可以自动更新。

应用场景
观察者模式常见于以下场景:
        1. 当一个对象的变化需要通知其他对象,而且你无法确切知道有多少个对象需要通知时,可以使用观察者模式。
        2. 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,这时使用观察者模式可以将这两者封装在独立的对象中,使它们各自独立地改变和复用。

优点
        1. 观察者模式降低了主题和观察者之间的耦合度,使得主题和观察者可以轻松地独立变化。
        2. 支持广播通信,观察者模式可以向多个对象同时发送通知。

缺点
        1. 如果观察者过多或通知机制过于复杂,容易导致性能问题。
        2. 如果观察者和主题之间存在循环依赖,可能会导致系统崩溃或出现死循环。

观察者模式是一种广泛应用的设计模式,在许多面向对象编程语言和框架中都有相应的实现,例如在事件处理、模型-视图-控制器 (MVC) 架构中都有观察者模式的影子。

Demo

        1.Subject类

internal abstract class SubjectBase
    {
        // 将所有观察者放入list集合
        private readonly List<Observer> observers = new List<Observer>();
        public event EventHandler<EventArgs> NotifyAllHandler;
        public virtual void NotifyAllObserver()
        {
            NotifyAllHandler?.Invoke(this, EventArgs.Empty);
        }
        /// <summary>
        /// 加入集合
        /// </summary>
        /// <param name="observer"></param>
        public virtual void AttachObserver(Observer observer)
        {
            observers.Add(observer);
        }
        /// <summary>
        /// 从观察者列表中去除
        /// </summary>
        /// <param name="observer"></param>
        public virtual void RemoveObserver(Observer observer)
        {
            observers.Remove(observer);
        }
    }
internal class Subject: SubjectBase
    {
       
    }

        2.Observer观察者抽象类

    /// <summary>
    /// 观察者抽象类
    /// </summary>
    internal abstract class Observer
    {
        protected SubjectBase _subject;
        /// <summary>
        /// 更新消息
        /// </summary>
        public abstract void Update(object? sender, EventArgs eventArgs);
        public virtual void SetSubject(SubjectBase subject)
        {
            if (subject == _subject) return;
            if (this._subject != null)
            {
                this._subject.RemoveObserver(this);
                this._subject.NotifyAllHandler -= Update;
            }
            this._subject = subject;
            this._subject.AttachObserver(this);
            this._subject.NotifyAllHandler += Update;
        }
    }

        3.具体观察者,需要继承Observer基类

internal class Observer_A : Observer
    {
        public override void Update(object? sender, EventArgs eventArgs)
        {
            Console.WriteLine($"Observer_A");
        }
    }

internal class Observer_B : Observer
    {
        public override void Update(object? sender, EventArgs eventArgs)
        {
            Console.WriteLine($"Observer_B");
        }
    }

调用

// 发布类
SubjectBase subject = new Subject();

// 观察者
Observer observerA = new Observer_A();
observerA.SetSubject(subject);
Observer observerB = new Observer_B();
observerB.SetSubject(subject);

// 发布类间隔通知
await Task.Run(() =>
{
    while (true)
    {
        subject.NotifyAllObserver();
        Console.WriteLine("====================================================");
        Thread.Sleep(3000);
    }
});

相关推荐

  1. C# 基于事件观察模式

    2023-12-28 10:30:07       50 阅读
  2. C# 观察模式

    2023-12-28 10:30:07       51 阅读
  3. 观察模式-C#

    2023-12-28 10:30:07       27 阅读
  4. C++中观察模式

    2023-12-28 10:30:07       29 阅读
  5. [C/C++] -- 观察模式

    2023-12-28 10:30:07       33 阅读
  6. c#观察设计模式

    2023-12-28 10:30:07       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-28 10:30:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-28 10:30:07       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-28 10:30:07       82 阅读
  4. Python语言-面向对象

    2023-12-28 10:30:07       91 阅读

热门阅读

  1. Django信号机制源码分析(观察者模式)

    2023-12-28 10:30:07       62 阅读
  2. 基数(Radix)排序

    2023-12-28 10:30:07       52 阅读
  3. C# LINQ

    C# LINQ

    2023-12-28 10:30:07      44 阅读
  4. MySQL8 一键部署

    2023-12-28 10:30:07       49 阅读
  5. etcd故障节点

    2023-12-28 10:30:07       50 阅读
  6. SpringBoot集成etcd,实现实时监听,实现配置中心

    2023-12-28 10:30:07       63 阅读
  7. Ubuntu安装WordPress并使用Nginx作为Web服务器

    2023-12-28 10:30:07       58 阅读