设计模式——观察者

设计模式之观察者模式 本文先是介绍了观察者模式,给出定义、重要的角色、具体的代码实现。然后介绍了EventBus,从使用到刨析原理。最后我们又简单地对照了一下观察者模式和监听器模式。 阅读详情

OBSERVER(观察者)

 

1、 意图

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

2、 别名

依赖(Dependents),发布-订阅(Publish-Subscribe)

3、 适用性

  • 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
  • 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其他的对象,而它又不能假定其他对象是谁。也就是说,你不希望这些对象是紧密耦合的。

4、 结构

5、 参与者

Subject

——目标知道它的观察者。可以有任意多个观察者观察同一个目标。

——提供注册和删除观察者对象的接口。

Observer

——为那些在目标发生改变时需获得通知的对象定义一个更新接口。

ConcreteSubject

——将有关状态存入各ConcreteObserver对象。

——当它的状态发生改变时,向它的各个观察者发出通知。

ConcreteObserver

——维护一个指向ConcreteSubject对象的引用。

——存储有关状态,这些状态应与目标的状态保持一致。

——实现Observer的更新接口以使自身状态和目标的状态保持一致。

6、 协作

  • 当ConcreteSubject发生任何可能导致其观察者与其本身状态不一致的改变时,它将通知它的各个观察者。
  • 在得到一个具体目标的改变通知后,ConcreteObserver对象可向目标对象查询信息。ConcreteObserver使用这些信息以使它的状态与目标对象的状态一致。

7、 效果

Observer模式允许你独立地改变目标和观察者。你可以单独复用目标对象而无需同时复用其观察者,反之亦然。它也使你可以在不改变目标和其他的观察者的前提下增加观察者。

1)  目标和观察者间的抽象耦合。一个目标所知道的仅仅是它有一系列观察者,每个都符合抽象的Observer类的简单接口。目标不知道任何一个观察者属于哪一个具体的类。这样目标和观察者之间的耦合是抽象和最小的。

2)  支持广播通信。不像通常的请求,目标发送的通知不需指定它的接收者。通知被自动广播给所有已向该目标对象登记的有关对象。目标对象并不关心到底有多少对象对自己感兴趣;它唯一的责任就是通知它的各观察者。

3)  意外的更新因为一个观察者并不知道其他观察者的存在,它可能改变目标的最终代价一无所知。在目标上看似无害的操作可能会引起一系列对观察者以及依赖于这些观察者的那些对象的更新。

8、 代码示例

Subject

package com.examples.pattern.observer;

import java.util.ArrayList;
import java.util.List;

/**   
* 目标对象,它知道它的观察者,并提供注册和删除观察者的接口。      
*/
public class Subject {
	
	
	/**
	 * 用来保存注册的观察者对象
	 */
	private List<Observer> observers = new ArrayList<Observer>();
	
	/**
	 * 注册观察者对象
	 * @param observer 观察者对象
	 */
	public void attach(Observer observer){
		observers.add(observer);
	}
	
	/**
	 * 删除观察者对象
	 * @param observer 观察者对象
	 */
	public void detach(Observer observer){
		observers.remove(observer);
	}
	
	protected void notifyObservers(){
		for(Observer observer : observers){
			observer.update(this);
		}
	}

}

ConcreteSubject

package com.examples.pattern.observer;

/**
 * 具体的目标对象,负责把有关状态存入到相应的观察者对象,
 * 并在自己状态改变时,通知各个观察者。
 */
public class ConcreteSubject extends Subject {
	
	
	/**
	 * 目标对象的状态 
	 */
	private String subjectState;

	public String getSubjectState() {
		return subjectState;
	}

	public void setSubjectState(String subjectState) {
		this.subjectState = subjectState;
		//状态发生了改变,通知各个观察者
		this.notifyObservers();
	}
	
	

}
Observer
package com.examples.pattern.observer;

/**
 * 观察者接口,定义一个更新的接口给那些目标发生改变的时候被通知的对象
 */
public interface Observer {

	/**
	 * 更新的接口
	 * 
	 * @param subject
	 *            传入目标对象,方便获取相应的目标对象的状态
	 */
	public void update(Subject subject);

}

ConcreteObserver

package com.examples.pattern.observer;

/**
 * 具体观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致
 */
public class ConcreteObserver implements Observer {
	
	/**
	 * 观察者的状态
	 */
	private String observerState;

	@Override
	public void update(Subject subject) {
		//具体的更新实现
		//这里可能需要更新观察者的状态,使其与目标的状态保持一致
		observerState = ((ConcreteSubject)subject).getSubjectState();
		System.out.println(observerState);
	}

}
Client
package com.examples.pattern.observer;

public class Client {
	
	public static void main(String[] args) {
		
		ConcreteSubject cs = new ConcreteSubject();
		ConcreteObserver co_1 = new ConcreteObserver();
		ConcreteObserver co_2 = new ConcreteObserver();
		
		cs.attach(co_1);
		cs.attach(co_2);
		
		cs.setSubjectState("这里是观察者模式");
	}

}
 

9、 相关模式

1)观察者模式与状态模式

观察者模式和状态模式是可以结合使用的。观察者模式的重心在触发联动,但是到底决定哪些观察者被联动,这时就可以采用状态模式来实现,也可以采用策略模式来进行选择需要联动的观察者。

2)观察者模式和中介模式

 


《设计模式——观察者》深入解析 设计模式是软件工程中用于解决特定问题的一套被认可的、经过实践证明有效的解决方案。观察者模式(Observer Pattern)属于行为型设计模式的一种,主要用于定义对象之间的一种一对多依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。它提供了一种对象行为的联动机制,是一种松耦合的设计。观察者模式在现代软件设计中非常常见,尤其在事件驱动编程和模型-视图-控制器(MVC)架构中扮演着重要的角色。 阅读详情

相关推荐

硬件工程师入门进阶,一文搞懂,看这篇就对了

每家公司的datasheet都有严格的规范,及独特的风格,有时候还会穿插一些原理性的介绍,比如ADI公司的一些ADC/DAC器件资料里面,还会包含AD/DA转换的原理性讲解内容,Datasheet既可以是我们设计上的好帮手,也是学习的好资料。在出货量大的产品中,尽量减少物料种类,比如开头说的,1%的电阻不得不用,那么5%的替换成1%的,物料种类就减少一种,量就大了,能不能争取更优的价格呢?如果说前面学的是内功,那这一关,是招式、是工具的使用,原理图和PCB设计都有对应的工具,教程也很多,且比较容易上手。

一路带飞的博客 5万+

Observer观察者设计模式(对象行为型)

意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新适用性 在以下任一情况下可以使用观察者模式: • 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 • 当对一个对象的改变需要同时改变其它对象 , 而不知道具体有多少对象有待改变。 • 当一个对象必须通知其它对象,

day day up 550

S32K3基于EB配置GPT触发WDG的实战解析

本文详细解析了S32K3 MCU基于EB tresos工具配置GPT定时器触发看门狗(WDG)的实战方法。通过分析协同工作机制、MCAL配置步骤及代码实现,帮助开发者构建可靠的硬件监控系统,提升汽车电子系统的安全性与实时性。

f9g0h的博客 204

Objective C--观察者模式

今天和大家分享的是观察者模式。观察者模式又叫做发布-订阅(Publish/Subscribe)模式。下面给出具体的定义。    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。    下面还是先给大家展示一下类关系图。    其实这个结构也还算

code life 1315

Win11家庭版如何让Win+R运行CMD默认管理员权限?3种方法实测有效

本文针对Win11家庭版用户,实测了三种让Win+R运行CMD默认获取管理员权限的有效方法。通过分析UAC机制与家庭版功能限制,详细介绍了注册表编辑、快捷方式创建与任务计划程序三种方案的原理、步骤与风险对比,帮助用户根据安全与效率需求选择最佳方案,实现一键高效管理。

sat99的博客 1268

Lane、PHY和Preset Value Bit

每个Lane支持不同的传输速度和带宽,例如PCIe 3.0中,一个Lane的传输速度可以达到8 GT/s(Giga Transfers per second),也就是1 GB/s(GigaBytes per second)。Preset Value Bit(预置值位)是在PCIe 3.0的Lane上新引入的一种机制,用于优化信号传输质量。PCIe设备可以包含多个Lane,例如x1、x4、x8、x16等,表示该设备同时使用的Lane数目,比如x16表示该设备采用了16个Lane,具有更高的传输速度和带宽。

weixin_58083606的博客 1296

在Java中,什么叫观察者设计模式(observer design pattern)?

下面是一个简单的Java代码演示观察者设计模式,其中一个WeatherData类是被观察者,而两个观察者CurrentConditionsDisplay和StatisticsDisplay都实现了Observer接口,以便接收WeatherData对象的状态变化通知并作出相应的处理。在观察者设计模式中,有两种角色:观察者和被观察者。在观察者设计模式中,目标对象和观察者对象之间是松耦合的,目标对象并不直接调用观察者对象的方法,而是通过定义一些接口,使得目标对象和观察者对象能够协同工作。

Blue92120的博客 845

嵌入式设备的switch 以及PHY 芯片调试和选型 (1)

越来越的设备需要多网口的需求,于是需求搭配一个交换机实现网口的扩展。但是很多软件或是硬件工程师在实际选型和应用中经常会遇到一些问题。这里总结一下,避免大家采坑。 几个概念: MAC(介质访问控制),可以理解成数据链路层即可 PHY(物理性),简单理解层转成物理层的连接组件即可 控制接口(MDC/DMIO,I2C,...

睿峰的博客 1万+

Design Pattern 设计模式【观察者】

  观察者设计模式中存在两种角色: 观察者和被观察者。   最经典的例子就是“猫叫了,老鼠跑了,惊醒了主人。”,这个例子也是我以前去微软面试的时候碰到的一个面试题,当时就是让我设计一下这个过程的实现框架。   在这个例子中,老鼠和主人其实就是观察者,而猫属于被观察者,老鼠和主人观察猫的变化,猫有了动作,老鼠和主人就要做出响应。被观察者,就是这个过程,也可以叫做整个事件的根本原因,亦可以叫直接导火索...

virusswb的专栏 151

告别‘小目标’丢失!手把手复现DNANet红外检测网络(PyTorch版)

本文详细介绍了如何使用PyTorch从零实现DNANet红外小目标检测网络,重点解析了DNIM模块和CSAM注意力机制的设计与实现。通过实战教程,帮助开发者解决红外小目标检测中的特征提取和训练调参难题,适用于军事侦察、安防监控等场景。

weixin_28701593的博客 252

BLDC&PMSM电机控制器硬件设计工程(八)72V 10kW电机控制器原理图工程及库文件

电机控制器基本需求:接口类型;MCU平台;通信接口;供电;信号采集;信号输出;功率;EMC或者认证需求。

小幽余生不加糖 373

观察者设计模式的理解

一、概念 观察者设计模式: 行为型的设计模式,也叫作发布订阅模式。 两个角色:被观察者(Observer),观察者(Observerable)。 被观察者维护观察者实例列表,当有事件发生时,调用观察者的方法进行通知。 二、代码实现 1、观察者 /** * 观察者 */ public interface Observer { // 被观察者有事件产生时,通过这个方法通知观察值 p...

dami_lixm的专栏 284

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

观察者设计模式

观察者设计模式 用订阅和发布来理解更好,我想了一下是的 为什么呢?因为监听器这个名词听起来是一个主动的,可实际监听器是一个被动的玩意 比如我们事件源发布一个事件,然后监听器订阅了这个事件就能做出动作。 里面涉及到三个对象,事件源,事件、监听器,大家好好理解一下 特点: 被观察者持有监听的观察者的引用 被观察者支持增加和删除观察者 被观察者主题状态改变,通知观察者 下面开始模拟观察者设计模式...

qq_24101357的博客 2万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

设计模式---观察者模式(DesignPattern_Observer)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 162

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。

2401_83916394的博客 371

设计模式之观察者设计模式

一、观察者与被观察者 这个模式很好理解,又被称之为发布订阅。没错其实很多的中间件都有这个模式,例如Redis、MQ等等。 而在JAVA原生的API中又为我们提供了观察者和被观察者的类。所以我们实现起来就更容易了。先拿类图理解一下 记住四个角色: 1.被观察者(Subject) 2.具体被观察者(ConcreteSubject) 3.观察者(...

HelloWorld! 319

常用设计模式之观察者

观察者设计模式 观察者模式(Observer)是软件设计模式的一种,定义了对象之间一种一对多的关系,也就是当一个对象数据发生变化时,会通知与之依赖的其他对象,以相应其数据变化,这种当目标对象数据发生变化时,与之对应的观察者对象数据随之发生变化的,具有一对多通知关系的设计模式叫做观察者设计模式。其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。 关键概...

zrg523的专栏 210

17【观察者设计模式】

观察者设计模式(Observer Pattern):又称为发布订阅模式(Publish/Subsribe),它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

緑水長流*z 2574
上一篇: 设计模式——代理模式
下一篇: 设计模式——命令模式
HingKwan
博客等级 码龄17年 51粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值