设计模式(二十)—— 观察者模式(定义、案例分析、特点、缺点)

本文详细介绍了观察者模式,包括模式定义、情景假设(如猫、狗和老鼠的例子)、模式特点(如支持广播通信、降低耦合度)以及模式的缺点(如通知耗时和循环依赖问题)。同时,提到了Java中对观察者模式的支持以及在MVC模式中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

文章内容主要参考了刘伟主编的《设计模式(第2版)》,同时也结合了自己的一些思考和理解,希望能帮到大家。


本篇讲解观察者模式,和中介者模式有相像之处。

在某些场景中,需要建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。

一个目标可以有任意数目的与之相依赖的观察者,一旦目标的状态发生改变,所有的观察者都将得到通知。
作为对这个通知的响应,每个观察者都将即时更新自己的状态,以与目标状态同步,这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅它并接收通知

正文

一、定义

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

那么问题就是如何去让所有的观察者一直监视被观察者的动态呢?其实这里看似观察者具有很大的主动权,但主动权在被观察者手上,即当被观察者需要做出改变时,自己需要手动的通知所有人,而不单单是改变自己罢了。
这时被观察者首先自身有个容器装下所有的观察者,当需要让观察者“看到变化”时,就遍历所有的观察者,并调用观察者自身该有的响应方法。

和中介模式相近的就是都有个容器装下所有的对象,不过中介者模式是多对多的,容器的作用仅是沟通,而自身并不算得上一个“真正的实体”,但观察者模式无论观察者和被观察者都是“真正的实体”。

二、情景假设

假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程。

三、情景分析

关于上面情景的类图(具体分析在下面)
在这里插入图片描述

左边的就是被观察者,有一个ArrayList容器装下所有的观察者,观察者在右边。

抽象目标类MySubject

public abstract class MySubject {
   
	protected ArrayList observers = new ArrayList<>();
	
	//注册方法
	public void attach(MyObserver</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值