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. 当一个抽象模型有两个方面,其中一个方面依赖于另一方面时。
        目录
        相关文章
        |
        6月前
        |
        设计模式 缓存 Java
        Java设计模式(二):观察者模式与装饰器模式
        本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
        |
        4月前
        |
        设计模式 消息中间件 传感器
        Java 设计模式之观察者模式:构建松耦合的事件响应系统
        观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
        429 8
        |
        9月前
        |
        设计模式 网络协议 Java
        【设计模式】【行为型模式】状态模式(State)
        一、入门 什么是状态模式? 状态模式(State Pattern)是一种行为设计模式,允许对象在其内部状态改变时改变其行为,使其看起来像是改变了类。状态模式的核心思想是将对象的状态封装成独立的类,并将
        369 16
        |
        9月前
        |
        设计模式 算法 前端开发
        【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
        一、入门 什么是职责链模式? 职责链模式是一种行为设计模式,它允许你将请求沿着一条链传递,直到有对象处理它为止。每个对象都有机会处理请求,或者将其传递给链中的下一个对象。 为什么需要职责链模式? 使用
        351 16
        |
        9月前
        |
        设计模式 存储 Java
        【设计模式】【行为型模式】备忘录模式(Memento)
        一、入门 什么是备忘录模式? 备忘录模式(Memento Pattern)是一种行为设计模式,用于在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便在需要时恢复该状态。它通常用于实现撤销操作
        305 8
        |
        9月前
        |
        设计模式 消息中间件 Java
        【设计模式】【行为型模式】命令模式(Command)
        一、入门 什么是命令模式? 命令模式是一种行为设计模式,它将请求或操作封装为对象,从而使你可以用不同的请求对客户进行参数化,并支持请求的排队、记录、撤销等操作。 命令模式的核心是将“请求”封装为独立的
        275 15
        |
        9月前
        |
        设计模式 算法 搜索推荐
        【设计模式】【行为型模式】策略模式(Strategy)
        一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
        199 14
        |
        9月前
        |
        设计模式 数据采集 算法
        【设计模式】【行为型模式】模板方法模式(Template Method)
        一、入门 1.1、什么是模板方法模式? 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
        295 13
        |
        9月前
        |
        设计模式 Java 编译器
        【设计模式】【行为型模式】解释器模式(Interpreter)
        一、入门 什么是解释器模式? 解释器模式(Interpreter Pattern)是一种行为设计模式,用于定义语言的语法表示,并提供一个解释器来处理该语法。它通常用于需要解释和执行特定语言或表达式的场
        221 11
        |
        9月前
        |
        设计模式 存储 JavaScript
        【设计模式】【行为型模式】迭代器模式(Iterator)
        一、入门 什么是迭代器模式? 迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种顺序访问聚合对象中元素的方法,而不需要暴露其底层表示。迭代器模式将遍历逻辑从聚合对象中分离出
        252 11