Java设计模式之观察者模式

引言

观察者(Observer)模式 又名发布-订阅(Publish/Subscribe)模式,是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个 “观察” 该对象的其他对象。

image-20220531230616909

一、引子:观察者模式解决怎么样的问题、怎么解决

现在我们碰到一个实际问题描述如下

假如你有两种类型的对象:顾客商店。顾客对某个特定品牌的产品非常感兴趣, 而该产品很快将会在商店里出售

顾客可以每天来商店看看产品是否到货。但如果商品尚未到货时,绝大多数来到商店的顾客都会空手而归

另一方面,每次新产品到货时,商店可以向所有顾客发送邮件 (可能会被视为垃圾邮件)。 这样,部分顾客就无需反复前往商店了,但也可能会惹恼对新产品没有兴趣的其他顾客

🤖 Q:我们似乎遇到了一个矛盾: 要么让顾客浪费时间检查产品是否到货, 要么让商店浪费资源去通知没有需求的顾客

A:使用观察者模式来解决这个问题,首先需要了解一下发布者与订阅者的概念,了解基础的Observer模式怎么运行,然后再来解决这个问题

拥有一些值得关注的状态的对象通常被称为目标,由于它要将自身的状态改变通知给其他对象, 我们也将其称为发布者publisher。所有希望关注发布者状态变化的其他对象被称为订阅者subscribers

回到上述问题

  • publisher -> 超市
  • subscribers -> 顾客

观察者模式建议你为发布者类添加订阅机制,让每个对象都能订阅或取消订阅发布者事件流

这并不像听上去那么复杂。实际上,我们用一张图就可以将观察者模式搞明白

二、一张图说明观察者模式的结构

image-20220601001524508

图源

可以看到图中有 publisher / subscriber / client 三个角色,他们各司其职,而观察者模式常用的几个角色无非以下几种

  • 基础发布者接口
  • 具体发布者实现类
  • 通用订阅者接口
  • 具体订阅者实现类,实现响应等操作

对于发布者而言

  1. 发布者一个用于存储订阅者对象引用的列表成员变量

    ArrayList<> subscribers = new ArrayList<>();
    

    image-20220427010533450

  2. 几个用于添加或删除该列表中订阅者的公有方法

    public boolean addSubscriber(subscriber);
    public boolean removeSubscriber(subscriber);
    
  3. 通知更新

    for(s : subscribers){
         
    	s.update();
    }
    

对于订阅者接口

在绝大多数情况下,该接口仅包含一个update更新方法,该方法可以拥有多个参数,使发布能在更新时传递事件的详细信息。

public void update(context);

对于订阅者

  • 订阅者通常需要一些上下文信息来正确地处理更新,因此需要实现订阅者接口

  • 发布者通常会将一些上下文数据作为通知方法的参数进行传递。发布者也可将自身作为参数进行传递,使订阅者直接获取所需的数据

  • 订阅者可以对得到的数据做出一些响应

三、Java观察者模式代码示例

EventManager.java: 基础发布者

import EventSubscriber;
import java.io.File;
import java.util.ArrayList;
import java
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java的观察者设计模式是一种一对多的依赖关系,其中目标对象维护一组观察者对象,当目标对象的状态发生变化时,它会自动通知并更新所有的观察者对象。这种模式可以使目标对象与观察者对象之间解耦,使它们可以独立地进行修改和重用。 在Java中,观察者模式已经被封装成了两个接口:目标接口(Observable)和观察者接口(Observer)。目标接口(Observable)定义了添加、删除和通知观察者对象的方法,而观察者接口(Observer)定义了观察者对象接收更新通知的方法。 在实际应用中,我们可以通过实现观察者接口(Observer)来创建具体的观察者对象,并通过实现目标接口(Observable)来创建具体的目标对象。具体的观察者对象可以订阅目标对象的状态变化,并根据变化做出相应的响应。 在Java中,观察者模式被广泛应用于各个领域。在Android开发中,许多常见的组件和框架都使用了观察者模式,比如OnClickListener、ContentObserver,以及RxJava、RxAndroid和EventBus等通讯库。这些例子都是基于观察者模式的实现,通过观察者模式可以实现组件之间的解耦和灵活的消息传递。 总结来说,Java的观察者设计模式是一种实现目标和观察者对象之间解耦的设计模式,它可以提高代码的灵活性和可维护性。在实际应用中,我们可以使用Java提供的目标接口(Observable)和观察者接口(Observer)来实现观察者模式,并通过具体的观察者对象订阅目标对象的状态变化。这种设计模式在Android开发中也被广泛应用,并带来了许多便利的消息传递和通讯方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java设计模式观察者模式(Observer Pattern)](https://blog.csdn.net/engineer_zh/article/details/78857166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [java设计模式观察者模式](https://blog.csdn.net/m0_47944994/article/details/127903096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值