当前位置: 首页 > news >正文

设计模式之观察者模式ObserverPattern(十一)

一、概述

        观察者模式 (Observer Pattern) 是一种行为型设计模式,又被称为发布-订阅 (Publish/Subscribe) 模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。

二、结构

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

  • Subject:观察对象,定义了注册观察者和删除观察者的方法。此外,它还声明了“获取现在的状态”的方法。
  • ConcreteSubject:具体观察对象,当自身状态发生变化后,它会通知所有已经注册的 Observer 角色。
  • Observer:抽象观察者,负责接收来自 Subject 角色的状态变化的通知,为此,它声明了 update 方法。
  • ConcrereObserver:具体观察者,当它的 update 方法被调用后,会去获取要观察的对象的最新状态。

三、代码实现

1、Observer

package com.xu.demo.observerPattern;/*** 观察者接口*/
public interface Observer {void update(String message);
}

2、ConcreteObserver

 

package com.xu.demo.observerPattern;/*** 观察者实例*/
public class ConcreteObserver implements Observer{private String name;public ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + ": " + message);}
}

3、Subject

package com.xu.demo.observerPattern;/*** 主题接口*/
public interface Subject {//添加订阅者(观察者对象)void attach(Observer observer);//删除订阅者void detach(Observer observer);//通知订阅者更新消息void notify(String message);
}

4、SubscriptionSubject

 

package com.xu.demo.observerPattern;import java.util.ArrayList;
import java.util.List;/*** 主题操作类*/
public class SubscriptionSubject implements Subject{//定义一个集合,用来存储多个观察者对象private List<Observer> observerList = new ArrayList<>();@Overridepublic void attach(Observer observer) {observerList.add(observer);}@Overridepublic void detach(Observer observer) {observerList.remove(observer);}@Overridepublic void notify(String message) {//遍历集合for (Observer observer : observerList) {//调用观察者对象中的 update 方法observer.update(message);}}
}

 5、ObserverPattern

 

 

package com.xu.demo.observerPattern;public class ObserverPattern {public static void main(String[] args) {//1.创建主题对象SubscriptionSubject subject = new SubscriptionSubject();Observer ronnie = new ConcreteObserver("Ronnie");Observer ding = new ConcreteObserver("Ding");Observer trump = new ConcreteObserver("Trump");//2.观察者订阅主题subject.attach(ronnie);subject.attach(ding);subject.attach(trump);//3.更新主题subject.notify("Java专栏更新了!");System.out.println("====================我是分割线==================");//4.观察者取消订阅主题subject.detach(ding);subject.detach(trump);//5.更新主题subject.notify("Python专栏更新了!");}}

运行结果:

至此,一个最简单的 发布-订阅 (Publish/Subscribe) 模式代码实例就完成了,大家认真理解好好体会,你也能成为IT高手,我们下回再见。

http://www.lryc.cn/news/367644.html

相关文章:

  • JavaScript 编程语言【 数据类型】日期和时间
  • RabbitMQ简单使用方法,以异步处理日志为例:
  • 二分+模拟,CF1461D - Divide and Summarize
  • C#操作MySQL从入门到精通(16)——使用子查询
  • 【vue实战项目】通用管理系统:图表功能
  • 第99天:权限提升-数据库提权口令获取MYSQLMSSQLOracleMSF
  • Java 环境配置 -- Java 语言的安装、配置、编译与运行
  • 升级最新版openssh-9.7p1及openssl-1.1.1h详细步骤及常见问题总结
  • 学习使用 Frida 过程中出现的问题
  • Java实现简单词法、语法分析器
  • Python实现半双工的实时通信SSE(Server-Sent Events)
  • python中的解包操作(*和**)
  • Lua 时间工具类
  • Qt——Qt网络编程之TCP通信客户端的实现(使用QTcpSocket实现一个TCP客户端例程)
  • Qt信号槽与函数直接调用性能对比
  • Python中的异常处理:try-except-finally详解与自定义异常类
  • vscode软件上安装 Fitten Code插件及使用
  • 人工智能小作业
  • 程序员搞副业一些会用到的工具
  • k8s更改master节点IP
  • c++【入门】已知一个圆的半径,求解该圆的面积和周长?
  • c#通过sqlsugar查询信息并日期排序
  • 使用 Qwen-Agent 将 8k 上下文记忆扩展到百万量级
  • Vyper重入漏洞解析
  • 53.ReentrantLock原理
  • “论边缘计算及应用”必过范文,突击2024软考高项论文
  • 浅谈安全用电管理系统对重要用户的安全管理
  • Docker的资源限制
  • MongoDB $rename 给字段一次重新命名的机会
  • OnlyOwner在Solidity中是一个修饰符,TypeError: