设计模式二十:观察者模式(Observer Pattern)

这篇具有很好参考价值的文章主要介绍了设计模式二十:观察者模式(Observer Pattern)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

定义了一种一对多的依赖关系,允许多个观察者(也称为订阅者)对象同时监听一个主题对象,当主题对象发生变化时,所有依赖于它的观察者都会收到通知并自动更新。

观察者模式的使用场景

观察者模式在许多场景中都可以发挥作用,特别是在需要解耦和实现对象间动态通信的情况下

  1. 事件处理和 GUI:
    在图形用户界面(GUI)应用中,用户界面元素(如按钮、文本框)可以作为观察者,而事件(如点击按钮)可以作为主题,以实现用户界面与业务逻辑之间的解耦。
  2. 订阅/发布模型:
    观察者模式常被用于实现发布/订阅模型,其中发布者是主题,订阅者是观察者。这在消息队列系统、事件总线等场景中非常有用,允许消息的生产者发布消息,而消费者订阅并处理消息。
  3. 通知和提醒系统:
    观察者模式可以用于实现通知和提醒系统。例如,在一个新闻网站中,当有新的新闻发布时,订阅了该类新闻的用户会收到通知。
  4. 股票市场分析:
    在金融领域,观察者模式可以用于股票市场分析工具。股票价格的变化可以作为主题,不同的分析器可以作为观察者,以便在价格变化时及时更新分析结果。
  5. 网络应用中的状态同步:
    在分布式系统或网络应用中,观察者模式可以用于状态同步。当一个节点的状态发生变化时,其他节点可以作为观察者,以便实时更新其本地状态。
  6. 游戏开发:
    在游戏开发中,观察者模式可以用于处理游戏内的事件、状态变化、角色行为等。例如,当一个角色受到伤害时,其他角色可以作为观察者获得相应的通知。
  7. 传感器数据监测:
    在物联网领域,传感器收集到的数据可以作为主题,不同的监测系统可以作为观察者,以便在数据变化时进行监测和报警。

观察者模式涉及的角色

  1. 主题(Subject):
    主题是被观察的对象,它维护一组观察者对象,并提供方法用于添加、删除和通知观察者。主题通常包含状态或数据,当状态变化时会通知所有观察者。
    定义了添加、删除和通知观察者的方法。
    维护一个观察者列表,用于存储注册的观察者。
    当主题状态变化时,调用通知方法以便通知所有注册的观察者。
  2. 具体主题(Concrete Subject):
    具体主题是实际的被观察对象,它继承或实现主题接口,负责实现主题的具体逻辑。它会在状态变化时通知所有已注册的观察者。
    继承或实现主题接口。
    包含需要被观察的状态或数据。
    在状态变化时,调用通知方法来通知所有观察者。
  3. 观察者(Observer):
    观察者是订阅主题状态变化的对象,它定义一个更新方法,当主题状态发生变化时,观察者的更新方法会被调用,从而观察者可以获取最新的信息并执行相应的操作。
    定义了一个更新方法,用于在主题状态变化时被调用。
    观察者通过该方法获取主题最新的状态信息,然后执行相应的操作。
  4. 具体观察者(Concrete Observer):
    具体观察者是实际的观察者对象,它实现了观察者接口的更新方法,以便在主题状态变化时执行特定的操作。
    实现观察者接口的更新方法,以便在主题状态变化时执行具体的操作。
    在更新方法中,根据主题的状态变化来做出响应。

java代码实例

演示了使用观察者模式实现一个天气预报系统

主题接口
package cn.observer.service;

public interface Subject {

    //添加接受这
    void addObserver(Observer_ observer);

    //一处接受者
    void reduceObserver(Observer_ observer);

    //消息变动
    void notifyObservers();

}

具体主题

//天气驿站
public class WeatherStation implements Subject{

    private List<Observer_> observers=new ArrayList<>();
    private float temperature;//天气温度
    @Override
    public void addObserver(Observer_ observer) {
        this.observers.add(observer);
    }

    @Override
    public void reduceObserver(Observer_ observer) {
        this.observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer_ observer: observers) {
            observer.recept(this.temperature);
        }
    }
    public void setTemperature(float temperature) {
        this.temperature = temperature;
        notifyObservers();
    }

}

观察者接口

//天气广播台

public interface Observer_ {

    void recept(float temperature);

}

具体观察者

public class WeatherDisplay implements Observer_{
    @Override    public void recept(float temperature) {
        System.out.println("当前温度:"+temperature+"度");    }
}

客户端

public class Observer {
    public static void main(String[] args) {
        WeatherStation station = new WeatherStation();
        WeatherDisplay display = new WeatherDisplay();

        station.addObserver(display);

        station.setTemperature(25.5f);

        station.reduceObserver(display);

        station.setTemperature(30.0f); 
    }


}

输出结果

当前温度:25.5度

观察者模式的优缺点

优点:

  1. 解耦性:
    观察者模式可以将主题对象与观察者对象之间的依赖关系解耦,使它们可以独立变化,不会相互影响。
  2. 灵活性和可扩展性:
    由于主题和观察者之间的关系是松耦合的,可以轻松添加新的观察者或修改现有的观察者,而不需要修改主题。
  3. 一对多通信:
    观察者模式允许一个主题同时通知多个观察者,这在实现发布/订阅模型、事件处理和消息传递等场景中非常有用。
  4. 可维护性:
    观察者模式使系统中的各个部分更容易理解和维护,因为它将复杂的交互逻辑分解为独立的观察者对象。
  5. 支持动态添加和移除观察者:
    可以动态地注册和注销观察者,使系统更加灵活。

缺点:文章来源地址https://www.toymoban.com/news/detail-663260.html

  1. 内存泄漏:
    如果观察者没有正确注销,它们仍然会保留对主题的引用,可能导致内存泄漏。
  2. 不当使用带来复杂性:
    过多或不合理地使用观察者模式可能会导致系统复杂化,降低可维护性。因此,在设计时需要权衡使用。
  3. 顺序问题:
    观察者模式中观察者的通知顺序是不确定的,这可能导致一些问题,特别是在观察者之间有相互依赖关系时。
  4. 性能问题:
    当观察者数量庞大且通知频繁时,可能会影响性能。因此,在高性能要求的系统中需要谨慎使用。

到了这里,关于设计模式二十:观察者模式(Observer Pattern)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式——观察者模式(Observer Pattern)+ Spring相关源码

    类型:行为型模式 目的:当一个对象的状态发生改变时,其所有依赖者(观察者)都会收到通知并自动更新。 2.1.1 定义观察者 2.1.2 定义被观察对象 2.1.3 使用 2.2.1 观察者接口Observer 2.2.1 被观察者对象Observable 2.3.1 观察者 2.3.2 被观察者 创建型模式 结构型模式 1、设计模式——

    2024年02月06日
    浏览(37)
  • 【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    有一个天气预报项目,需求如下: 气象站可以将每天测量到的温度、湿度、气压等等以公告的形式发布出去(比如发布到自己的网站或第三方) 需要设计开放型API,便于其他第三方也能接入气象站获取数据 提供温度、气压、湿度的接口 测量数据更新时,要能实时的通知给第三

    2024年02月14日
    浏览(29)
  • java设计模式(二十)观察者模式

    观察者模式 又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。 1.抽象目标类(Subject) :它用一个列表记录当前目标对象

    2024年02月08日
    浏览(31)
  • 软件设计模式系列之二十一——观察者模式

    观察者模式(Observer Pattern)是一种行为型设计模式,它允许对象之间建立一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这个模式也被称为发布-订阅模式,因为它模拟了一个主题(发布者)与多个观察者(订阅者)之间的

    2024年02月08日
    浏览(42)
  • 观察者设计模式(Observer Design Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

            观察者设计模式(Observer Design Pattern)是一种行为型设计模式,它定义了一种对象间的一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,通知所有观察者对象,使它们能够自动更新。 主题(Subject):主题是一个抽象类或

    2023年04月24日
    浏览(32)
  • 二十三种设计模式第十六篇--观察者模式

    观察者模式是一种行为型设计模式,它建立了一种对象间的一对多依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这种模式可以实现对象间的松耦合通信,提高系统的可扩展性和灵活性。 观察者模式的核心是两个角色:主题(

    2024年02月12日
    浏览(38)
  • 二十四种设计模式与六大设计原则(三):【装饰模式、迭代器模式、组合模式、观察者模式、责任链模式、访问者模式】的定义、举例说明、核心思想、适用场景和优缺点

    接上次博客:二十四种设计模式与六大设计原则(二):【门面模式、适配器模式、模板方法模式、建造者模式、桥梁模式、命令模式】的定义、举例说明、核心思想、适用场景和优缺点-CSDN博客 目录 装饰模式【Decorator Pattern】 定义 举例说明 核心思想 适用场景 优缺点 迭代

    2024年04月17日
    浏览(44)
  • 观察者模式(Observer)

    观察着模式是一种行为设计模式,可以用来定义对象间的一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。 观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者

    2024年02月14日
    浏览(28)
  • 观察者模式(Observer)

    事件订阅者者(Event-Subscriber) 监听者(Listener) 观察者 是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个“观察”该对象的其他对象。 1. 问题 假如你有两种类型的对象 :“顾客”和“商店”。顾客对某个特定品牌的产品非常感兴趣(例如最

    2024年02月12日
    浏览(28)
  • 设计模式---观察者模式

    1,概念         属于行为模式的一种,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一对象主题对象,这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察者),

    2024年02月15日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包