c#设计模式-行为型模式 之 观察者模式

简介: 又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者 对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自 动更新自己。

 定义:

又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者 对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自 动更新自己。

在观察者模式中有如下角色:

    1. Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每 个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
    2. ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具 体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
    3. Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知 时更新自己。
    4. ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知 时更新自身的状态。

    案例

    这里案例使用一个委托进行多播来进行对热水器的观察

    加热器类

    首先定义一个全局变量,温度temperature,然后使用event声明一个事件,委托名称使用无返回值的Action,参数为int。然后写一个for循环模拟烧水,温度temperature大于95时,执行事件。

    public class HeaterSubject
    {
        private int _temperature;
        public event Action<int> OnBoilEvent;
        public void BoilWater()
        {
            for (int i = 0; i < 100; i++)
            {
                _temperature++;
                if (_temperature >= 95)
                {
                    OnBoilEvent.Invoke(_temperature);//触发事件:发出警报,显示水温
                }
            }
        }
    }

    image.gif

    监视者

    热水器上一般都有显示屏和警报器,这里模拟两个观察者,分别是显示器和警报器

    因为上面声明的委托参数是int,这里的观察者参数也要匹配,等一下才可以通过多播的形式插入

    public class DisPlayObserver
    {
        /// <summary>
        /// 显示水温
        /// </summary>
        /// <param name="temperature"></param>
        public void Display(int temperature)
        {
            Console.WriteLine($"显示屏-当前温度是:{temperature}");
        }
    }

    image.gif

    public class AlertObserver
    {
        /// <summary>
        /// 发出警报
        /// </summary>
        /// <param name="temperature"></param>
        public void MakeAlert(int temperature)
        {
            Console.WriteLine($"语音报警器-温度是{temperature}");
        }
    }

    image.gif

    main方法

    在main方法中,实现new一个热水器的实例,然后使用多播将多个方法绑定到一个委托实例。当调用此类委托时,所有绑定的方法会被一次全部调用,最后调用热水器的烧水方法

    public static void Main(string[] args)
        {
            HeaterSubject subject = new HeaterSubject();
            //订阅发出警报
            subject.OnBoilEvent += new AlertObserver().MakeAlert;
            //订阅显示水温
            subject.OnBoilEvent += new DisPlayObserver().Display;
            subject.BoilWater();
        }

    image.gif

    image.gif

    多播的优缺点

      1. 优点: 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。 被观察者发送通知,所有注册的观察者都会收到信息【可以实现广播机制】
      2. 缺点: 如果观察者非常多的话,那么所有的观察者收到被观察者发送的通知会耗时 如果被观察者有循环依赖的话,那么被观察者发送通知会使观察者循环调用,会导致系统崩溃

      使用场景

        1. 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。
        2. 当一个抽象模型有两个方面,其中一个方面依赖于另一方面时。
        目录
        相关文章
        |
        4月前
        |
        设计模式 监控 安全
        设计模式 | 观察者模式
        设计模式 | 观察者模式
        20 0
        |
        3月前
        |
        设计模式 前端开发 JavaScript
        观察者模式 vs 发布-订阅模式:两种设计模式的对决!
        欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
        |
        24天前
        |
        设计模式 监控 Java
        设计模式 - 观察者模式(Observer):Java中的战术与策略
        【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
        |
        2月前
        |
        设计模式 存储 Java
        【设计模式】观察者模式
        【设计模式】观察者模式
        |
        7天前
        |
        设计模式 消息中间件 存储
        【设计模式系列笔记】观察者模式
        观察者模式是一种设计模式,它允许一个对象(主题)维护一组依赖于它的对象(观察者)并在状态发生变化时通知它们。这种模式属于行为型模式。在观察者模式中,主题是被观察的对象,而观察者是依赖于主题的对象,当主题的状态发生变化时,所有注册的观察者都会得到通知并自动更新。
        19 0
        |
        22天前
        |
        设计模式 Java
        23种设计模式,观察者模式的概念优缺点以及JAVA代码举例
        【4月更文挑战第9天】观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
        24 2
        |
        2月前
        |
        设计模式 存储 算法
        Java设计模式---行为型模式
        Java设计模式---行为型模式
        |
        2月前
        |
        设计模式 前端开发
        观察者模式--设计模式
        观察者模式--设计模式
        10 0
        |
        4月前
        |
        设计模式 Java Spring
        设计模式之观察者模式
        设计模式之观察者模式
        26 0
        |
        4月前
        |
        设计模式 算法 自动驾驶
        常见的设计模式(模板与方法,观察者模式,策略模式)
        随着时间的推移,软件代码越来越庞大,随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前,使用的是面向过程开发来设计大型的软件程序,面向过程开发将软件分成一个个单独的模块,模块之间使用函数进行组合,最后完成系统的开发,每次需要修改软件,如果不涉及好各个模块的关系,就会导致软件系统难以维护,从而导致软件变得不可使用。面向对象方法用对象模拟问题域中的实体,以对象间的联系刻画实体间联系
        68 2