java 设计模式 观察者模式 新闻消息推送

Java基础 设计模式 这几种设计模式也都有各自特定的适用场景,在很多软件系统的设计和开发中都发挥着重要作用。具体哪种设计模式最常用,还会因不同的业务领域、软件规模、开发团队的习惯等因素而有所不同。 阅读详情

观察者模式,字面意思有个观察者,那么就应该有一个被观察者。两个定义:
观察者:Observer (比如新闻客户端,你自己的微信号)
被观察者:Observable(新闻推送端,你关注的微信公众号)
1.观察者可以同时订阅多个被观察者。
2.被观察者可以同时被多个观察者订阅。
3.被观察者发生改变时会影响到所有的观察者。
这里写图片描述
对于每个用户都存在这三条线路。
Java中已经帮我们实现了观察者模式,借助于java.util.Observable和java.util.Observer。
接下来代码时间。
需求:新闻推送端News,需要向某个客户ClientX端推送消息,客户端可以选择去打开或者关闭推送功能。
新闻推送端News代码

package test;

import java.util.Observable;

public class News extends Observable{

    private String news;

    public String getNews() {
        return news;
    }

    public void setNews(String news) {
        this.news = news;
        //发生改变
        setChanged();
        //推送消息到客户端
        notifyObservers();
    }
}

新闻客户端代码

package test;

import java.util.Observable;
import java.util.Observer;

public class ClientX implements Observer {

    /**
     * 打开推送功能
     * @param observable  被观察者对象(这里是新闻推送端)
     */
    public void openPushMsg(Observable observable)  
    {  
        //添加到观察者列表
        observable.addObserver(this);  
    } 
    /**
     * 实现接口重新的方法
     * 有新消息推送来时,会被调用
     */
    public void update(Observable observable, Object arg) {
        if(observable instanceof News){//判断是否来自新闻推送端
            News news=(News) observable;
            System.out.println("现在最新消息:"+news.getNews());
        }

    }
    /**
     * 关闭推送功能
     * @param observable  被观察者对象(这里是新闻推送端)
     */
    public void closePushMsg(Observable observable){
        //从观察者列表移除
        observable.deleteObserver(this);
    }

}

测试

package test;

public class Test  
{  
    public static void main(String[] args)  
    {  
        News news=new News();
        ClientX bObserver1=new ClientX();
        //客户端打开推送功能
        bObserver1.openPushMsg(news);
        news.setNews("世界末日了");
        //客户端关闭推送功能
        bObserver1.closePushMsg(news);
        news.setNews("发现新大陆");

    }  
}

执行结果:

现在最新消息:世界末日了

从执行结果上来看,只执行了打开推送功能时的消息推送。

java.util.Observable和java.util.Observer,的源码解析

  • 先看一下观察者Observer接口的源码:
/*
 * Copyright (c) 1994, 1998, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.

 */
package java.util;

/**
 * A class can implement the <code>Observer</code> interface when it
 * wants to be informed of changes in observable objects.
 *
 * @author  Chris Warth
 * @see     java.util.Observable
 * @since   JDK1.0
 */
public interface Observer {
    /**
     * This method is called whenever the observed object is changed. An
     * application calls an <tt>Observable</tt> object's
     * <code>notifyObservers</code> method to have all the object's
     * observers notified of the change.
     *
     * @param   o     the observable object.
     * @param   arg   an argument passed to the <code>notifyObservers</code>
     *                 method.
     */
    void update(Observable o, Object arg);
}

打开之后就一个update()的方法。每当被观察者改变的时候,这个方法会得到执行。而且通过方法我们可以得到被观察者对象和传递的一个Object对象。

  • Observable的源码
    代码虽然不多,也就不到一百行吧,但是注释太多,先看结构图吧:
    这里写图片描述
    一个boolean changed变量用来判断,被观察者是否改变。
    一个Vector< Observer > obs集合对象,用来保存注册的观察者。
  • addObserver
/**
     * Adds an observer to the set of observers for this object, provided
     * that it is not the same as some observer already in the set.
     * The order in which notifications will be delivered to multiple
     * observers is not specified. See the class comment.
     *
     * @param   o   an observer to be added.
     * @throws NullPointerException   if the parameter o is null.
     */
    public synchronized void addObserver(Observer o) {
        if (o == null)
            throw new NullPointerException();
        if (!obs.contains(o)) {
            obs.addElement(o);
        }
    }

如果传递进来的观察者对象不为空,就添加进集合中

  • deleteObserver
 /**
     * Deletes an observer from the set of observers of this object.
     * Passing <CODE>null</CODE> to this method will have no effect.
     * @param   o   the observer to be deleted.
     */
    public synchronized void deleteObserver(Observer o) {
        obs.removeElement(o);
    }

有添加就有移除,移除观察者对象。

  • notifyObservers无参
public void notifyObservers() {
        notifyObservers(null);
    }

无参的唤醒方法会调用有参的唤醒方法。

  • 列表内容
 public void notifyObservers(Object arg) {
        Object[] arrLocal;

        synchronized (this) {

            if (!changed)
                return;
            arrLocal = obs.toArray();
            clearChanged();
        }

        for (int i = arrLocal.length-1; i>=0; i--)
            ((Observer)arrLocal[i]).update(this, arg);
    }

如果被观察者发生改变,就会把集合变成数组,然后遍历数组,调用每个观察者的update方法。

几个主要的方法就这么多,所有的被观察者的注册、取消注册和唤醒观察者的方法都是一样的。java封装成一个类就完成了方法的重复利用。如果采用面向接口的设计模式,那么不同的被观察者就必须去实现这些方法,而这些方法的逻辑是一样的,就不能重复利用代码了。

java的几种设计模式 2. 工厂模式:将对象的创建过程封装起来,隐藏具体实现,提供一个公共的接口。6. 责任链模式:将请求的发送者和接收者解耦,将多个对象连成一条链,请求沿着链传递,直到有一个对象处理请求。3. 观察者模式:定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,其他依赖它的对象会收到通知并自动更新。例如,复制一个已有的电子档案,修改其中的内容。```9. 建造者模式:将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。```4. 模板方法模式:定义一个算法的骨架,具体实现由子类决定。 阅读详情

相关推荐

因内存不足原因导致fragment空白解决方案

在androidx之前,一般我们防止Fragment重建是在actvitity的onCreate方法中使用savedInstanceState?.remove(“android:support:fragments”)或者savedInstanceState?但是在androidx中,使用这两行代码不生效,但是看FragmentActivity中的FRAGMENT_TAG还是android:support:fragments,那为什么会不生效呢,后来点进去看发现。

qq_39431405的博客 547

Java设计模式之一:观察者模式

Java设计模式之一:观察者模式

杨荧的优快云博客 1万+

Nature风格的北半球投影图,几行代码就能绘制...

在子刊***Nat. Clim. Chang.***中,通过北极俯视投影表示NAO和AO的EOF分解。仅在定义图层的时候设置为该投影,其余设置content,绘制contourf都是PlateCaree。如子刊Nature Geosci中表示了海冰的漂移,还添加了DEM底图,非常美观。以海温数据为例,ERA5月温度平均,是一张721*1440的0.25degTIF。现在的结果看起来不错,但太大了,我们如果只需要北半球的数据,则需要指定经纬度。绘制完结果也是正方形,和ArcGIS差不多,见之前的推文。

wlh2067的博客 1292

Java 设计模式——观察者模式

本文介绍了观察者模式的相关知识。

代码星辰的博客 6038

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1090

k8s部署 普罗米修斯(Prometheus)监控

Prometheus是一个开源的服务监控系统和时序数据库其提供了通用的数据模型和快捷数据采集、存储和查询接口它的核心组件Prometheus服务器定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉 取数据新拉取到啊的 数据大于配置的内存缓存区时,数据就会持久化到存储设备当中。

D2961953033的博客 3855

java设计模式之观察者模式

java设计模式之观察者模式

m0_47944994的博客 7342

手把手教你学Simulink——基于通信协议与标准的场景实例:卫星通信中的网络安全协议(IPSec)仿真

随着卫星通信在国防、金融、应急指挥、能源管网等关键领域的广泛应用,其安全性已成为系统设计的核心要求。然而,卫星链路具有广播特性、长距离传输、地面站分布广等特点,极易遭受窃听、篡改、重放、中间人攻击等网络威胁。传统的“信任链路层安全”已不足以应对现代网络攻击。为此,国际标准组织(如IETF、ETSI、CCSDS)推荐在卫星通信中部署协议,实现端到端的数据机密性、完整性、身份认证和抗重放保护。本文将手把手教你如何在中构建一个符合标准的仿真系统,涵盖从明文传输到加密隧道的完整安全链路建模。本文完整实现了。

MHD0815的博客 149

Java设计模式之观察者模式

观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),是一种行为型模式,定义对象间一对多的依赖关系(注册),使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新(通知)。Observer 接口是抽象观察者,它监视目标对象的变化,当目标对象发生变化时,观察者得到通知,并调用 void update(Observable o,Object arg) 方法,进行相应的工作。2.当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

cxbtdd的博客 2493

【DRAM存储器六十二】DDR5介绍--引脚和基本功能简介

详述DDR5与DDR4的引脚区别和DDR5基本功能

highman110的博客 524

69页完整版智慧港口综合解决方案

智慧港口需求4港机远程操控等自动化改造需求自动化码头AGV无线通信及专用视频系统需求安全生产视频监控类需求港机RCMS及设备管理需求岸边智能理货码头三维全景应用智慧港口解决方案5自动化码头AGV/跨运车/无人集卡无线接入港机远控视觉及冗余无线通信视觉集卡防吊起系统集装箱码头岸边智能理货港机RCMS系统无线接入港机智能化管理(无线高清视频监控、一键报警、远程抄表系统)港口拖轮无线接入岸边溢油监测系统TD-LTE覆盖及业务终端接入港口生产管理系统港口可视化集群调度港口GiNMS综合网络设备智能管理全球作业效率最

zuoan1993的博客 2129

Java实现常用设计模式之观察者模式

意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。如何解决:使用面向对象技术,可以将这种依赖关系弱化。关键代码:在抽象类里有一个 ArrayList 存放观察者们。应用实例: 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。

xtho62的博客 7177

手把手教你从入门到精通C#串口通信

本文以我开发的串口助手SComTool为例,详细介绍《C#串口通信从入门到精通》专栏的目录内容,本专栏由一个高级工程师多年实战经验总结,绝对是c#串口通信的葵花宝典!带您从入门到精通C#串口通信!

qq_34059233的博客 3万+

Java开发中的设计模式之观察者模式详细讲解

/ 观察者收到通知时执行的更新方法// 注册观察者// 移除观察者// 通知所有观察者观察者模式是一种强大而灵活的设计模式,通过定义一对多的依赖关系,实现了对象之间的松耦合通信。它在Java开发中有着广泛的应用,尤其是在事件驱动的场景下。通过上述代码示例和分析,我们可以看到观察者模式如何在状态变化时通知相关对象,并保持系统的可扩展性和可维护性。在实际开发中,合理使用观察者模式可以显著提高代码的模块化程度。

cuijiying的博客 1471

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

设计模式之观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都可以得到通知并自动更新。

Java领域优秀创作者 2122

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java 观察者模式示例_观察者设计模式示例

java 观察者模式示例 本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 1.观察者模式 2.什么是观察者模式 3.实施观察者模式 4. Java的内置观察者模式 5.何时使用观察...

最佳 Java 编程 394

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【三】Java 设计模式学习记录:观察者模式

文章目录一、观察者模式(行为型模式)1.1 场景1.2 普通解决方案1.3观察者模式定义1.4 观察者模式原理二、代码实现2.1 代码结构2.2 上代码2.3 扩展性三、 框架应用参考资料 一、观察者模式(行为型模式) 1.1 场景 有这么个项目需求,直接使用尚硅谷的例子(同理的也可以使用什么新闻中心,发布消息这样的例子) 1.2 普通解决方案 不用设计模式有个方案简单说下就是气象站提供各种获取的接口,当有数据更新,气象站会更新数据(或者推送给其他网站),之后通过getXX获取的数据都是最新的。 简单来说

Genmer的博客 337

观察者模式

一、观察者模式 1.什么是观察者模式        观察者又叫发布-订阅模式(Publish/Subscribe),定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。 二、示例        用户手机客户端在...

outdata的博客 226

观察者模式(设计模式详解)

观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,它的所有依赖者都会收到通知并自动更新。

qq_46624276的博客 318

观察者模式总结

观察者模式由两部分zuchang 观察者模式核心思想:

成功不必在我,然功力必不唐娟 1422

23种设计模式之四:观察者模式

【代码】23种设计模式之四:观察者模式。

holyms的博客 362

【西瓜带你学设计模式 | 第二期-观察者模式】观察者模式——推模型与拉模型实现、优缺点与适用场景

本文介绍观察者模式的定义、核心角色与用途,详解推 / 拉两种实现模型及同步、异步方式,分析优缺点、适用场景

无籽西瓜a的博客 532

设计模式15-观察者模式

观察者模式:类似于公众号(被观察者或者通知者)被你(观察者或者是订阅者)订阅后,公众号发送推荐文章。

weixin_37813118的博客 1161

浅析Java设计模式(三)

本篇文章继续来学习Java的设计模式,这篇文章来解析行为型模式种的几种比较常用的设计模式。

smily的博客 483
上一篇: java 设计模式 策略模式 以英雄联盟为背景
下一篇: java设计模式 装饰模式 魔域战力系统
彼天
博客等级 码龄11年 37粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值