java设计模式——观察者模式(Observer Pattern)

【Java设计模式】Java设计模式之(九)观察者模式(Observer Pattern) 观察者模式属于行为型模式。 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。 观察者一般可以看做是第三者,举例说明: (1)比如在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了。 (2)比如,拍卖会的时候,大家相互叫价,拍卖师会观察最高标价,然后通知给其它竞价者竞价,这就是一个观察者模式。 (3)对于观察者模式而言,肯定有观察者和被观察者 阅读详情
概述:
       观察者模式是使用频率最高的设计模式之一,它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。

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

结构:
  • Subject(目标):目标又称为主题,它是指被观察的对象。在目标中定义了一个观察者集合,一个观察目标可以接受任意数量的观察者来观察,它提供一系列方法来增加和删除观察者对象,同时它定义了通知方法notify()。目标类可以是接口,也可以是抽象类或具体类。
  • ConcreteSubject(具体目标):具体目标是目标类的子类,通常它包含有经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知;同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有的话)。如果无须扩展目标类,则具体目标类可以省略。
  • Observer(观察者):观察者将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法update(),因此又称为抽象观察者。
  • ConcreteObserver(具体观察者):在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者Observer中定义的update()方法。通常在实现时,可以调用具体目标类的addObserver()方法将自己添加到目标类的集合中或通过deleteObserver()方法将自己从目标类的集合中删除。

UML图:


场景:在平时生活中有很多场景都有观察者模式的影子,比如商城宣传、街头艺人、马路交通信号灯等等,这里就举一个过马路的例子,一般十字路口都会有红绿灯,不管行人还是车辆都要根据交通信号灯的信号来确定什么时候过马路,红灯停、绿灯行,这是小学都学过的交通规则了,当然不守交通规则的sb不算。这里的交通信号灯就相当于目标(被观察者),行人或者司机属于观察者。

代码分析:
/**
 * Created by **
 * 目标抽象类
 */
public abstract class Subject {
    private ArrayList<Observer> observers = new ArrayList<Observer>();

    /**
     * 增加观察者
     * @param observer
     */
    public void addObserver(Observer observer){
        observers.add(observer);
    }

    /**
     * 移除观察者
     * @param observer
     */
    public void deleteObserver(Observer observer){
        observers.remove(observer);
    }

    /**
     * 向观察者发出通知
     * @param string
     */
    public void notifyObservers(String string){
        for (Observer observer : observers) {
            observer.update(string);
        }
    }
}

/**
 * Created by **
 * 交通信号灯:具体目标
 */
public class TrafficLight extends Subject {
    /**
     * 显示红灯
     */
    public void showRedLight(){
        LogFactory.log("红灯亮了");
        super.notifyObservers("red");
    }
    /**
     * 显示绿灯
     */
    public void showGreenLight(){
        LogFactory.log("绿灯亮了");
        super.notifyObservers("green");
    }
}

/**
 * Created by **
 * 观察者接口
 */
public interface Observer {
    // 更新操作
    public void update(String string);
}

/**
 * Created by **
 * 司机:观察者
 */
public class Driver implements Observer {
    @Override
    public void update(String string) {
        LogFactory.log("E lights :"+string);
        if ("red".equals(string)){
            stop();
        }else if ("green".equals(string)){
            travel();
        }else {
            LogFactory.log("交通信号灯坏了?...");
        }
    }

    private void travel(){
        LogFactory.log("绿灯亮了,可以过马路了");
    }

    private void stop(){
        LogFactory.log("红灯亮了,停止前行");
    }
}

客户端调用:
TrafficLight trafficLight = new TrafficLight();

Driver driver = new Driver();

trafficLight.addObserver(driver);

trafficLight.showGreenLight();

try {
    Thread.sleep(2000);
    trafficLight.showRedLight();
} catch (InterruptedException e) {
    e.printStackTrace();
}

log输出:
08-19 15:14:41.842 2648-2648/? D/test: 绿灯亮了
08-19 15:14:41.842 2648-2648/? D/test: E lights :green
08-19 15:14:41.842 2648-2648/? D/test: 绿灯亮了,可以过马路了
08-19 15:14:43.842 2648-2648/? D/test: 红灯亮了
08-19 15:14:43.842 2648-2648/? D/test: E lights :red
08-19 15:14:43.842 2648-2648/? D/test: 红灯亮了,停止前行

      上述例子,我只是添加了一个观察者,如果要添加多个观察者直接调用addObserver方法即可,另外观察者模式在java语言中的地位非常重要所以jdk里边提供了相关的接口来支持该模式。

JDK提供的Observable类及Observer接口:
  • Observer接口:相当于观察者接口。该接口只声明一个方法:update(Observable observable, Object data)。
  • Observable类:相当于目标抽象类(Subject)。该抽象类中有多个方法:
          
下面将上述代码做一下修改,将具体的目标类继承Observable,将具体的观察者类实现Observer接口:
/**
 * Created by **
 * 交通信号灯:具体目标
 */
public class TrafficLight extends Observable {
    /**
     * 显示红灯
     */
    public void showRedLight(){
        LogFactory.log("红灯亮了");
        super.setChanged();
        super.notifyObservers("red");
    }
    /**
     * 显示绿灯
     */
    public void showGreenLight(){
        LogFactory.log("绿灯亮了");
        super.setChanged();
        super.notifyObservers("green");
    }
}

/**
 * Created by **
 * 司机:观察者
 */
public class Driver implements Observer {
    /*@Override
    public void update(String string) {
        LogFactory.log("E lights :"+string);
        if ("red".equals(string)){
            stop();
        }else if ("green".equals(string)){
            travel();
        }else {
            LogFactory.log("交通信号灯坏了?...");
        }
    }*/
    @Override
    public void update(Observable observable, Object data) {
        LogFactory.log("E lights :"+data);
        if ("red".equals(data.toString())){
            stop();
        }else if ("green".equals(data.toString())){
            travel();
        }else {
            LogFactory.log("交通信号灯坏了?...");
        }
    }
    private void travel(){
        LogFactory.log("绿灯亮了,可以过马路了");
    }

    private void stop(){
        LogFactory.log("红灯亮了,停止前行");
    }

}

客户端的代码不需要更改,最后log输出都是一样一样的,你们可以自己验证一下。

优点:
  • 观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色。
  • 观察者模式在观察目标和观察者之间建立一个抽象的耦合。
  • 观察者模式支持广播通信。
  • 观察者模式符合“开闭原则”的要求。

缺点:
  • 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

适用环境:
  • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
  • 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
  • 一个对象必须通知其他对象,而并不知道这些对象是谁。
  • 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

扩展:
      MVC模式是一种架构模式,它包含三个角色:模型(Model),视图(View)和控制器(Controller)。观察者模式可以用来实现MVC模式,观察者模式中的观察目标就是MVC模式中的模型(Model),而观察者就是MVC中的视图(View),控制器(Controller)充当两者之间的中介者(Mediator)。当模型层的数据发生改变时,视图层将自动改变其显示内容。


电脑的kernelbase.dll故障怎么处理?kernelbase.dll是什么文件 kernelbase.dll​是一个系统文件,属于Microsoft Windows操作系统的一部分。该DLL(动态链接库)文件包含了许多基本且低级的系统函数,这些函数被Windows上运行的各种程序和进程调用。kernelbase.dll通常与Kernel32.dll紧密相关,它是实现许多Windows API(应用程序编程接口)的封装。这些API涉及到内存管理、输入输出操作、进程和线程管理以及其他许多核心的操作系统功能。 阅读详情

相关推荐

Android音频学习(十四)——加载音频设备

loadHwModule 是 Android 音频系统的核心初始化函数,负责加载音频硬件抽象层(HAL)的模块实现。它建立 AudioPolicyService 与底层硬件的桥梁,将配置文件(audio_policy_config.xml)中的标签<module>定义转化为可操作的硬件对象,加载的是音频硬件模块(HAL实现),每个模块对应一种音频设备类型,以动态库的形式存在,负责与底层音频硬件交互。

miemie2014的博客 1730

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

观察者设计模式(Observer Design Pattern)是一种行为型设计模式,它定义了一种对象间的一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,通知所有观察者对象,使它们能够自动更新。方法中,我们创建了一个具体主题和两个具体观察者,将观察者添加到主题中,然后改变主题的状态并观察输出结果。方法中,它会遍历所有注册的监听器,并将事件分发给匹配的监听器。,该方法会遍历注册的监听器,并将事件分发给匹配的监听器。接口,因此在Spring中,事件发布主要由。

龙飞的博客 1659

影刀RPA验证码识别避坑指南:官方指令、Python ddddocr与第三方图鉴怎么选?

本文深度对比了影刀RPA验证码识别的三种方案:官方AI指令、Python ddddocr开源库和第三方图鉴服务。从识别率、成本、维护性等维度分析各方案优劣,提供实战选型建议和优化技巧,帮助技术决策者在自动化流程中高效解决验证码识别难题。

weixin_30790841的博客 469

设计模式-观察者模式 Observer

观察者模式是一种行为设计模式,允许对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。在这种模式中,发生状态改变的对象被称为“主题”(Subject),依赖它的对象被称为“观察者”(Observer)。观察者模式(Observer Design Pattern)也被称为发布订阅模式在 GoF 的《设计模式》一书中,它的定义是这样的:翻译成中文就是:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。

weixin_46926189的博客 2384

避坑指南:用pygrib处理ERA5气象数据时遇到的5个典型问题

本文总结了使用pygrib库处理ERA5气象GRIB数据时常见的五个典型问题及解决方案,涵盖数据获取、内存管理、时间处理、空间插值和性能优化。重点针对气象数据插值这一核心挑战,提供了处理不规则网格、缺失值和跨日期变更线的实用代码示例与优化策略,帮助用户高效、稳定地完成气象数据分析工作。

weixin_28224217的博客 184

从ATE到ATPG:基于Scan Chain的芯片制造缺陷定位实战解析

本文深入解析了从ATE到ATPG的芯片制造缺陷定位实战技术,重点介绍了Scan Chain的工作原理、异步复位触发器处理技巧以及Design Compiler中的DFT实现方法。通过实际案例展示了如何利用ATE测试数据和ATPG工具进行精确的缺陷定位,并分享了提升测试覆盖率和优化测试成本的专业技巧,为芯片测试工程师提供了宝贵的实战经验。

weixin_42527160的博客 379

设计模式之观察者模式(Observer Design Pattern)

观察者模式也被称为发布订阅模式,或者叫监听器模式大家更不觉得陌生,是11种行为型模式之一。 观察者模式在平时运用的较多叫法也不一,常见的有观察者(Observer)、监听器(Listener)、订阅者(Subscriber)、消费者(Consumer)等,有观察者就会有被观察者,与观察者对应依次为主题(Subject)、分发器(Dispatcher),发布者(Publisher)、生产商(Producer)。 在 GoF 的《设计模式》一书中,它的定义是这样的:Define a one-to-many

xjj1314的专栏 630

实现边缘实时动物检测:YOLOv5模型优化与树莓派4B部署全攻略

本文介绍了基于高性能计算机训练YOLOv5目标检测模型,并部署到树莓派4B实现实时动物检测的全流程。主要内容包括:1)在高性能计算机上通过Anaconda创建虚拟环境,安装YOLOv5项目并进行模型训练;2)将训练好的best.pt模型迁移到树莓派,配置轻量级Miniconda环境;3)连接树莓派摄像头,运行实时检测程序。该系统兼顾了训练效率和边缘设备部署的实用性,可广泛应用于智慧农业、生态监测等场景。文中详细说明了数据准备、环境配置和部署步骤,为开发轻量级目标检测系统提供了完整参考方案。

m0_64661770的博客 200

设计模式-观察者模式

观察者模式(发布订阅模式)通过定义对象间的一对多依赖关系,实现状态变更时自动通知所有依赖对象。文中以系统间文件推送为例,展示了如何利用Spring事件机制实现解耦:推送C系统后触发事件,反馈A系统监听该事件异步处理。模式核心包含Subject(管理Observer注册/移除/通知)和Observer(定义更新逻辑)。实际应用中可根据需求选择同步/异步、进程内/跨进程(如消息队列)等实现方式,需注意观察者执行顺序控制。该模式适用于注册后发邮件等非强一致性场景,通常配合补偿任务保证可靠性。

qq_56517253的博客 405

超越防抖:索尼CXD5254GG芯片如何重新定义电子影像稳定

索尼CXD5254GG芯片通过融合6轴IMU与图像传感器数据,重新定义了电子影像稳定技术。其核心突破在于实时地平线校正、抑制果冻效应和镜头畸变校正,并搭载智能画质控制器提升画面细节。该芯片适用于广播制作、体育娱乐、安防监控和机器人视觉导航等专业领域,提供开箱即用的优化参数配置,大幅缩短开发周期。CXD5254GG不仅实现稳定成像,更通过姿态感知与智能优化,为专业影像应用提供了完整的稳定解决方案。

致力于lidar应用开发 112

Qt 调用YOLO模型(代码)

本文介绍了如何在 Qt C++ 环境中集成 YOLO 模型进行目标检测,包括模型封装、界面设计和实时处理等关键步骤。通过这种方法,你可以快速开发出具有目标检测功能的 Qt 应用程序,应用于监控系统、机器人视觉、图像分析等多个领域。

轩宇的博客 258

13.观察者模式设计思想

观察者模式(Observer Pattern)的定义:定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。01.观察者模式基础主要解决什么问题呢?一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。模式动机:建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。定义:定义对象间一对多依赖关系,当一个对象状态发生改变,其依赖对象都会收到通知并自动更新。02.观察者模式实现。

杨充 966

基于遗传算法改进BP神经网络的电池容量SOC预测

,遗传算法BP神经网络能很好的实现对电池容量soc的训练和预测,BP神经网络是一种成熟的神经,相对于其他神经网络,拥有很多的训练函数,传递函数,可以调节的参数非常多,对各种问题都可以达到一个比较理想的效果,关键看如何调试参数,选择训练传递函数,遗传算法改进BP神经网络的初始权值阈值,达到改进BP神经网络的目的,从而更好的实现对电池容量SOC的预测

abc991835105的博客 764

Java - 【设计模式】观察者模式(Observer Pattern)

设计模式 - 观察者模式(Observer Pattern) -> 解决问题:一个对象的状态发生改变,如何通知其他对象? 被观察对象(Subject) 观察对象(Observer) -> 注意: 互相指定,互相包含! 一:被观察对象(Subject) 1> 维护一个可变对象,该对象变化对应一个方法,该方法内部需要通知所有观察者(notifyAllObservers) private int state; public void setState(int state) {

⚡ 578

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java设计模式 Design Pattern:观察者模式 Observer Pattern

意图 Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 定义对象间的一种一对多的关系,从而使得当对象发生变化时,所有依赖他的对象都得到通知并且自动更新结构  Subject : knows its observers. Any number of Observer ob

OYJJ的专栏 1514

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

详解Java设计模式之观察者模式(Observer Pattern)

观察者模式又叫做发布-订阅(Publish/Subscribe)模式,模型-视图( Model/View)模式、源-监听器( Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。

Elegance never goes out of fashion 3627

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

在Java中,什么叫观察者设计模式(observer design pattern)?

下面是一个简单的Java代码演示观察者设计模式,其中一个WeatherData类是被观察者,而两个观察者CurrentConditionsDisplay和StatisticsDisplay都实现了Observer接口,以便接收WeatherData对象的状态变化通知并作出相应的处理。在观察者设计模式中,有两种角色:观察者和被观察者。在观察者设计模式中,目标对象和观察者对象之间是松耦合的,目标对象并不直接调用观察者对象的方法,而是通过定义一些接口,使得目标对象和观察者对象能够协同工作。

Blue92120的博客 845

Java 设计模式——观察者模式(Observer Pattern)

    前言 一、简介 二、实现步骤 (1)实现方式: (2)举例: (3)步骤简化版: 三、代码实现 四、总结 五、Demo地址 六、参考文档 七、内容推荐 前言 本来没想写前言的,感觉就是一堆废话。那就当废话浏览一下吧,只是提醒一下自己一些注意的东西。 在许多博客当中看到把观察者模式又称呼为发布-订阅模式。其实我感觉两者确实很相似,但还是有一丢丢的区别: 在...

斌林诚上的博客 726

Java常用设计模式--观察者模式(Observer Pattern)

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 四个角色 Subject:抽象被观察者,把所有观察者对象的引用保存到集合中,然后 提供添加,移除,和通知观察者对象更新的方法。 ConcreteSubject:被观察者,集合存放观察者,重写增删和通知观察者 的方法,当发生变化时通知观...

gang_luo的博客 398

JAVA设计模式之 观察者模式【Observer Pattern】

一、概念:   简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。

小吕丶Code阶区 2087

Java设计模式-观察者模式(Observer Pattern)

观察者模式是软件设计模式中常见的一种,是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

IT熊的专栏 495

Java设计模式之观察者模式(Observer Pattern)

Observer Pattern 是一种常用的设计模式,它是一种事件监听模型,

停止更新 4481

Java设计模式 十五 观察者模式 (Observer Pattern)

观察者模式是一种非常常见且实用的设计模式,它通过一对多的方式,帮助实现对象之间的松耦合通信。主题和观察者的解耦使得它非常适用于动态变化和事件驱动的应用场景,特别是在GUI、消息通知、系统监控等领域具有广泛应用。

空 980

Java设计模式——观察者模式【Observer Pattern】

观察者设计模式

scorpio的博客 720

Java Design Pattern Observer 观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 简而言之,观察者模式=发布者+注册者。 观察者模式用来对GUI中的动作做侦听。Swing GUI的例子就表明了动作侦听是怎样实现观察者模式的。 代码: 1.Subject.java package c

xiaowanggedege的专栏 2308

java设计模式—观察者模式(Observer Pattern)

观察者模式 观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系 代码: public interface Observer { public void update(); } public class Observer1 implements Observer

weixin_43920664的博客 194
上一篇: java设计模式——中介者模式(Mediator Pattern)
下一篇: java设计模式——状态模式(State Pattern)
OODeveloper
博客等级 码龄12年 43粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值