深入理解设计模式-行为型之观察者

概述

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,当主题对象发生变化时,所有依赖于它的观察者对象都会得到通知并更新。

在观察者模式中,有两个主要角色:

  • Subject(主题):维护一个观察者列表,提供方法用于添加、删除和通知观察者。
  • Observer(观察者):定义一个接口,用于接收主题对象的通知,以便在主题发生变化时更新自身状态。

电商系统的应用

促销通知的例子:
假设我们有一个电商系统,当某件商品有促销活动时,需要通知所有订阅了该商品的用户。在这个例子中,商品是主题,用户是观察者

首先,我们创建一个Subject接口,表示主题:

public interface Subject {void registerObserver(Observer o);//添加void removeObserver(Observer o);//删除void notifyObservers();//通知
}

接下来,我们创建一个Observer接口,表示观察者:

public interface Observer {void update(String discountInfo);
}

现在,我们创建一个具体的主题,如Product,实现Subject接口:

public class Product implements Subject {private ArrayList<Observer> observers;// 折扣消息private String discountInfo;public Product() {observers = new ArrayList<>();}public void registerObserver(Observer o) {observers.add(o);}public void removeObserver(Observer o) {int index = observers.indexOf(o);if (index >= 0) {observers.remove(index);}}public void notifyObservers() {for (Observer o : observers) {o.update(discountInfo);}}public void discountChanged() {notifyObservers();}public void setDiscountInfo(String discountInfo) {this.discountInfo = discountInfo;discountChanged();}
}

接着,我们创建一个具体的观察者,如User,实现Observer接口:

public class User implements Observer {private String userName;private String discountInfo;private Subject product;public User(String userName, Subject product) {this.userName = userName;this.product = product;product.registerObserver(this);}public void update(String discountInfo) {this.discountInfo = discountInfo;display();}public void display() {System.out.println("用户 " + userName + " 收到促销通知: " + discountInfo);}
}

2个接口,2个具体的类。
现在我们可以创建一个Product实例(主题)并向其注册User观察者。当Product的促销信息发生变化时,User会收到通知并显示促销信息。

public class Main {public static void main(String[] args) {//注册2个用户User user1 = new User("张三", product);User user2 = new User("李四", product);// 模拟商品促销信息更新Product product = new Product();product.setDiscountInfo("本周末满100减50");product.setDiscountInfo("双十一全场5折");}
}

在这个例子中,我们创建了一个Product实例并向其注册了两个User观察者。当Product的促销信息发生变化时,所有观察者都会收到通知并更新自己的显示。这个例子展示了观察者模式在电商系统中的应用,如何实现商品和用户之间的交互。

源码应用

观察者模式在许多Java框架和库中都有应用,以下是一些常见的示例:

  • Java 内置类库:Java内置了一些使用观察者模式的类,例如 java.util.Observable 和 java.util.Observer。虽然在较新的Java版本中已经不推荐使用,但它们仍然是观察者模式的一个例子。你可以通过扩展 Observable 类并实现 Observer 接口来创建自己的观察者模式。

  • Swing GUI 框架:Swing中的事件监听就是观察者模式的应用。比如,你可以为按钮添加动作监听器,当按钮被点击时,监听器会收到通知并执行相应的操作。

  • Spring Framework:Spring框架广泛使用观察者模式,特别是在事件驱动编程中。例如,Spring的事件机制允许你在应用中发布和监听事件,当某些事件发生时,注册的监听器会收到通知并执行相应的逻辑。

  • Android开发:Android中的事件处理也是观察者模式的应用,例如,你可以为按钮添加点击事件监听器,当按钮被点击时,监听器会收到通知。

这些只是一些例子,观察者模式在许多框架和应用中都有广泛的应用。它提供了一种松耦合的方式,允许不同部分的代码能够在发生变化时保持同步,从而实现更加灵活和可维护的程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/39010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何安装Python?

如何安装Python&#xff1f; 安装Python非常简单&#xff0c;让我们一步步来进行。 1. 访问官方网站 首先&#xff0c;您需要访问Python官方网站&#xff08;https://www.python.org/&#xff09;。在首页上&#xff0c;您会看到一个大大的「Downloads」按钮&#xff0c;点击…

【Redis实践篇】使用Redisson 优雅实现项目实践过程中的5种场景

文章目录 1.前言2.使用方式1. 添加Redisson依赖&#xff1a;2. 配置Redis连接信息3. 使用场景3.1. 分布式锁3.2. 限流器&#xff08;Rate Limiter&#xff09;3.3. 可过期的对象&#xff08;Expirable Object&#xff09;3.4. 信号量&#xff08;Semaphore&#xff09;3.5. 分布…

ChatGPT在智能文档搜索和信息抽取中的应用如何?

智能文档搜索和信息抽取是信息检索和知识管理领域中的关键问题&#xff0c;而ChatGPT作为一种强大的自然语言处理模型&#xff0c;正在这些领域发挥越来越重要的作用。在大数据时代&#xff0c;文档数量庞大&#xff0c;信息量巨大&#xff0c;有效地搜索和抽取信息变得至关重要…

spfa判断负环

思路&#xff1a; &#xff08;1&#xff09;负环&#xff1a;区别于正环&#xff0c;在求最短路过程中&#xff0c;正环会绕路&#xff0c;故不会被讨论&#xff0c;而负环会不断让路总权更短&#xff0c;会让算法不断循环&#xff1b; &#xff08;2&#xff09;于是考虑统…

JVM---垃圾回收算法介绍

目录 分代收集理论 三种垃圾回收算法 标记-清除算法&#xff08;最基础的、基本不用&#xff09; 标记-复制算法 标记-整理算法 正式因为jvm有了垃圾回收机制&#xff0c;作为java开发者不会去特备关注内存&#xff0c;不像C和C。 优点&#xff1a;开发门槛低、安全 缺点…

windows Socket简单编程实例

服务端 #include <winsock2.h> #include <string.h> #include <stdio.h> #include <stdlib.h>#pragma comment(lib, "Ws2_32.lib")void error_handing(const char* message) {fputs(message, stderr);fputc(\n, stderr);exit(1); } int mai…

任我行CRM系统存在 SQL注入漏洞[2023-HW]

任我行CRM系统存在 SQL注入漏洞 一、 产品简介二、 漏洞概述三、 复现环境四、 漏洞复现小龙POC又是一通哈拉少 五、 修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及…

学习ts(二)数据类型(接口和对象类型、数组类型)

interface 重名会重合到一起 如果两个interface名称相同&#xff0c;会把两个合到一起 重复定义同一个需要类型相同 不能多或者减少属性 设置任意key 当定义接口返回数据时&#xff0c;我们不确定接口会返回多少&#xff0c;知道所需要的固定属性&#xff0c;其余属性可以…

学习笔记十四:K8S最小调度单元POD概述

K8S最小调度单元POD概述 k8s核心资源Pod介绍Pod是什么Pod如何管理多个容器Pod网络Pod存储代码自动发版更新收集业务日志 Pod工作方式自主式Pod控制器管理的Pod(防误删除) 如何基于Pod运行应用 k8s核心资源Pod介绍 K8s官方文档&#xff1a;https://kubernetes.io/ K8s中文官方文…

【博客692】grafana如何解决step动态变化时可能出现range duration小于step

grafana如何解决step动态变化时可能出现range duration小于step 1、grafana中的step和resolution grafana中的 “step” grafana本身是没有提供step参数的&#xff0c;因为仪表盘根据查询数据区间以及仪表盘线条宽度等&#xff0c;对于不同查询&#xff0c;相同的step并不能…

校园外卖小程序怎么做

校园外卖小程序是为满足校园内学生和教职员工的外卖需求而开发的一种应用程序。它涵盖了从用户端、商家端、骑手端、电脑管理员到小票打印、多商户入驻等多个方面的功能&#xff0c;以下将逐一介绍。 1. 用户端功能&#xff1a;校园外卖小程序为用户提供了便捷的订餐和外卖服务…

Zmq适配Win7 SP0 / Win XP/ Win 2k

1.目的 由于发布版本的libzmq使用了较多新的系统特性&#xff0c;导致在低版本windows平台上无法使用。 因此&#xff0c;需要对zmq源码进行修改以适配低版本的系统&#xff0c;如Win7 SP0&#xff0c;Win XP&#xff0c;Win2003等等。 2.Win7 SP0 #if defined ZMQ_HAVE_WIN…

深入理解epoll

文章目录 概述1. epoll_create - 创建一个epoll实例2. epoll_ctl - 控制epoll实例的事件结构体介绍events取值&#xff1a;data&#xff1a; 联合体&#xff08;共用体&#xff09;&#xff1a; 3. epoll_wait - 等待事件发生伪代码总结 概述 在网络编程中&#xff0c;高效地处…

每天一道leetcode:797. 所有可能的路径(图论中等深度优先遍历)

今日份题目&#xff1a; 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到节…

c++11 explicit关键字的作用

explicit 在C中&#xff0c;explicit关键字用来修饰类的构造函数&#xff0c;被修饰的构造函数的类&#xff0c;不能发生相应的隐式类型转换&#xff0c;只能以显示的方式进行类型转换。因为无参构造函数和多参构造函数本身就是显示调用的。再加上explicit关键字也没有什么意义…

​五金件机器视觉定位​并获取外观轮廓软硬件视觉方案

【检测目的】 五金件机器视觉定位&#xff0c;视觉检测五金件轮廓并矫正五金件位置进行涂油 【客户要求】 FOV:540*400mm 【拍摄与处理效图一】 【拍摄与处理效图二】 【实验原理及说明】 【方案评估】 根据目前的图像和处理结果来看&#xff0c;可以检测出产品轮廓并进行位置…

HCIP-OpenStack搭建

1、OpenStack概述 OpenStack是一种云操作系统&#xff0c;OpenStack是虚拟机、裸金属和容器的云基础架构。可控制整个数据中心的大型计算、存储和网络资源池&#xff0c;所有资源都通过具有通用身份验证机制的API进行管理和配置。管理员也可通过Web界面控制&#xff0c;同时授…

Qt 之 QPushButton,信号与槽机制

文章目录 前言一、QPushButton二、信号与槽机制总结 前言 一、QPushButton 当我们开发基于Qt框架的图形用户界面&#xff08;GUI&#xff09;应用程序时&#xff0c;经常需要在界面上添加按钮来实现用户交互。Qt提供了一个名为 QPushButton 的类作为按钮控件的实现。QPushButt…

基于RoCE的应用程序的MTU注意事项

目录 基于RoCE的应用程序的MTU注意事项 探测网络中的MTU设置 概要 原文 MTU测试结果 DOC: CentOS安装tshark抓包工具 基于RoCE的应用程序的MTU注意事项 原文&#xff1a;https://support.mellanox.com/s/article/MLNX2-117-1682kn InfiniBand协议最大传输单元&#xff…

WSL2 Ubuntu子系统安装OpenCV

文章目录 前言一、&#xfeff;基本概念二、操作步骤1.下载源码2.安装依赖3.运行编译4.配置路径 前言 OpenCV用C语言编写&#xff0c;它的主要接口也是C语言&#xff0c;但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语…