• C#实现观察者模式


      观察者模式是一种软件设计模式,当一个对象的状态发生变化时,其所有依赖者都会自动得到通知。

      观察者模式也被称为“发布-订阅”模式,它定义了对象之间的一对多的依赖性,当一个对象状态改变时,所有依赖于它的对象都会得到通知并进行更新。观察者模式通常用于实现事件机制:一个对象触发自己的一个事件,也就是改变自己的状态,然后通知其他的一切依赖于它的对象。

      在观察者模式中,主要有两种角色:

    1. 主题(Subject):它是被观察的对象。当主题的状态发生改变时,会通知所有已注册的观察者。
    2. 观察者(Observer):它是依赖于主题的对象,当接到主题的通知时,会更新自己的状态。

      观察者模式的主要优点是它支持动态的关联,一个系统对象的行为依赖于另一个系统对象的状态。并且它是一种松耦合的设计模式,一个主题不必知道其任何观察者,例如观察者的具体类。

      观察者模式广泛应用于各种编程语言的库和框架中,例如在.NET中,它被用于实现事件模型。

      然而,观察者模式也有一些缺点。例如,如果一个主题有大量的直接和间接的观察者,将会花费大量的时间来通知所有的观察者。另外,如果观察者和主题之间存在循环依赖,可能会导致系统行为的不确定性。

      以下是一个基本的观察者模式的实现:

      首先,我们定义一个IObserver接口和一个ISubject接口:

    public interface IObserver
    {
        void Update(string message);
    }
    
    public interface ISubject
    {
        void RegisterObserver(IObserver observer);
        void RemoveObserver(IObserver observer);
        void NotifyObservers(string message);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    然后,我们实现一个具体的主题Subject

    public class Subject : ISubject
    {
        private List<IObserver> observers = new List<IObserver>();
    
        public void RegisterObserver(IObserver observer)
        {
            observers.Add(observer);
        }
    
        public void RemoveObserver(IObserver observer)
        {
            if (observers.Contains(observer))
            {
                observers.Remove(observer);
            }
        }
    
        public void NotifyObservers(string message)
        {
            foreach (var observer in observers)
            {
                observer.Update(message);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    接下来,我们实现一个具体的观察者Observer

    public class Observer : IObserver
    {
        private string name;
    
        public Observer(string name)
        {
            this.name = name;
        }
    
        public void Update(string message)
        {
            Console.WriteLine($"{name} received: {message}");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    最后,我们可以创建一个主题和多个观察者,并将观察者注册到主题上:

    namespace ObserverMode
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("测试C#单例模式");
    
                ISubject subject = new Subject();
    
                IObserver observer1 = new Observer("Observer1");
                IObserver observer2 = new Observer("Observer2");
    
                subject.RegisterObserver(observer1);
                subject.RegisterObserver(observer2);
    
                subject.NotifyObservers("Hello, observers!");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    运行结果
    在这里插入图片描述

      在这个例子中,当我们调用NotifyObservers方法时,注册到subject的所有观察者都会得到通知,并调用它们的Update方法。

  • 相关阅读:
    基本代码讲解
    SourceTree提示128错误
    企业怎么选择广告片的投放途径
    云等保安全合规解决方案
    原生微信小程序学习第一部分
    持续集成(CICD)- Jenkins插件安装失败解决办法
    python 动态规划(背包问题和最长公共子串)
    数据结构与算法之字典: Leetcode 349. 两个数组的交集 (Typescript版)
    RobotFramework入门(一)简要介绍及使用
    R语言使用MASS包的polr函数构建有序多分类logistic回归模型、使用VGAM包的vglm函数对有序多分类logistic回归模型进行平行性假设作检验
  • 原文地址:https://blog.csdn.net/yao_hou/article/details/134483798