使用Observer模式改善现有软件设计——构建简便的通知

[quote]Observer又叫观察者模式,它的意图是当一个对象进行改变时,所有依赖于它的对象都可以得到通知。(观察者模式定义了一种一对多地依赖模式,让多个观察者同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。这里的主题对象就是指通知者,又叫做发布者。观察者又叫订阅者。)[/quote]

听起来这个模式似乎非常有用,它属于对象行为型模式,一般在一个系统中,把一个功能分割成由多个类共同完成,如果此时每个类之间需要进行同步的协作,怎么办?使用Observer解决问题。一般来说Observer适用于任何情况。

一般来说,我们可以在系统中让每个相关联的类再类与类中调用互相自己的引用来解决问题,达到通知的效果,但是这样一来有个问题,类与类的关联太大,偶合太大,而且过多引用容易产生碎对象。不过我想,现在有了DI框架,已经不是个问题了,但是如果不使用DI呢?问题还是有,我们种不会一直DI,当然,有些人愿意这样一直引入个SPRING IOC包,这个另当别论。如果在系统在设计时已经说明,对哪个类不可以修改,这个时候你要在类里添加一个引用怎么办?(当然,这种情况不大可能发生。),如果你不停的引用,虽然你有IOC,但是有个问题你确无法很好解决,每次添加一个新类,你总是要修改原有类的方法,怎么样可以不改变代码?很简单,一个新类,继承抽象基类,这就是Observer的用处所在,之后只需要把添加的新类注册到一个列表里既可。而本身这个类似于一个小容器的东西不仅可以提供注册,它还有删除和修改的列表的方法。

对于Observer模式,本身比较繁杂,但是有了JDK类库内建的支持,使得使用Observer模式变的简单,不需要进行类似于跟踪观察者,对通知的管理等等。但是JDK内建支持也有些问题,它必须要你使用继承,一般直接继承会有些问题,最重要的问题是内建的支持不够灵活,所有为了完成自己的业务规则,必须自己手动去实现整个Observer模式。

关于观察者模式,在优快云上有个很好的博文。地址:http://blog.youkuaiyun.com/wanghao72214/archive/2009/03/23/4017507.aspx
以下的代码是从这个帖子里复制来的。

//主题基类
import java.util.Vector;
public abstract class Subject {
//观察者列表
private Vector<Observer> vectObserver = new Vector<Observer>();
//增加一个观察者
public void attach(Observer observer){
vectObserver.add(observer);
}
//去除一个观察者
public void detach(Observer observer){
vectObserver.remove(observer);
}
//通知观察者更新
public void notifyObservers(){
for(int i=0; i<vectObserver.size(); i++){
Observer observer = vectObserver.get(i);
observer.update();
}
}
//获取主题信息
public abstract String getSubject();
}
//银行柜台类
public class Counter extends Subject{
//当前业务号
private String bizNo;
//柜台名称
private String name;
//构造函数
public Counter(String name){
this.name = name;
}
//获取当前业务号
public String getBizNo(){
return this.bizNo;
}
//设置当前业务号
public void setBizNo(String bizNo){
this.bizNo = bizNo;
}
//获取主题信息
public String getSubject(){
return "请" + this.bizNo + "号到" + this.name + "号柜台办理业务";
}
}
//管理部门类
public class Manager extends Subject{
//管理部门名称
private String name;
//构造函数
public Manager(String name){
this.name = name;
}
//获取主题信息
public String getSubject(){
return this.name + "发布最新紧急公告";
}
}
//观察者基类
public abstract class Observer {
protected String name;
protected Subject subject;
//构造函数
public Observer(String name,Subject subject){
this.name = name;
this.subject = subject;
}
//更新信息
public abstract void update();
}
//小显示屏类
public class SmallScreen extends Observer{
//构造函数
public SmallScreen(String name,Subject subject){
super(name,subject);
}
//更新显示屏
public void update(){
try{
System.out.println(this.name + ":" + subject.getSubject());
}
catch(Exception err){
}
}
}
//音箱类
public class Speaker extends Observer{
//构造函数
public Speaker(String name,Subject subject){
super(name,subject);
}
//更新音箱
public void update(){
try{
System.out.println(this.name + ":" + subject.getSubject());
}
catch(Exception err){
}
}
}
//业务系统类
public class BankBiz {
public static void main(String[] args) {
//银行柜台
Counter counter = new Counter("1号柜台");
//1,2号小屏、3号音箱
SmallScreen smallScreen1 = new SmallScreen("1号小屏",counter);
SmallScreen smallScreen2 = new SmallScreen("2号小屏",counter);
Speaker speaker = new Speaker("3号音箱",counter);
//银行柜台加入观察者
counter.attach(smallScreen1);
counter.attach(smallScreen2);
counter.attach(speaker);
//9号办理业务
counter.setBizNo("9");
//通知更新
counter.notifyObservers();

//管理部门
Manager manager = new Manager("风险控制部");
//1号小屏
smallScreen1 = new SmallScreen("1号小屏",manager);
//管理部门加入观察者
manager.attach(smallScreen1);
//通知更新
manager.notifyObservers();
}
}

把主题与观察者分别抽象出来,因为主题与观察者之间有可以公用的方法,之后让每一个需要变成主题的类去继承抽象主题基类,让需要被观察的类继承观察者抽象基类就可以了。

但是基于抽象基类的主题与观察者还有些缺点,有的时候改变了注册,删除的业务规则时,我们还得修改代码,有的时候为了方便,我们可以直接把主题与观察者抽像基类抽象成一个接口。之后在继承接口类中去实现注册,删除,修改的方法。

光知道一个Observer的实现又有何用,要把Observer灵活运用到系统中才是王道。有的时候,我们的反映需要不是既时的,有的时候需要延时,有的时候甚至需要让各子通知后的程序运行在不同的线层当中,或者有的时候这些对象需要跨越多个不同的生命周期,这时问题就开始复杂起来了。
JavaScript观察者模式:从Subject/Observer契约到生产级实现 观察者模式是一种基础但常被误用的软件设计模式,其核心在于Subject(被观察者)与Observer(观察者)之间的松耦合通知契约。它并非简单的事件监听或回调注册,而是强调状态变更的主动广播、响应逻辑的被动接收,以及角色职责的严格分离。该模式的价值在于解耦数据源与消费方,支撑开闭原则,广泛应用于响应式系统、跨框架通信和微前端状态同步等场景。本文聚焦TypeScript类型安全下的Subject/Observer接口定义、运行时校验机制、防抖与批量通知优化,并落地为可撤销的表单状态管理器,直击真实工程中内存泄 阅读详情

相关推荐

ZedBoard+Vivado(二)——PS + PL实现流水灯

硬件:Zedboard 软件:Vivado2018.2 + Win10 本文参考了http://blog.chinaaet.com/cuter521/p/35978的设计 1 设计 功能:PS + PL流水灯 语言:C 流程:创建工程-&amp;gt;IP Integrator-&amp;gt;综合、实现、生成Bitstream-&amp;gt;SDK 2 流程 2.1 创建工程 跟上一篇步骤完全相同,这里不用添加源文...

q416524389的博客 3695

观察者模式_OBSERVER_案例详解

<br />之前讲过一篇关于单列模式的模式设计讲解,今天就就对观察者模式进行讲解下吧,在23种设计模式中,观察者模式算是模式设计中的皇后,尤其是在我们做软件设计过的过程中所体现的更是立足无穷,再说它好,还不如来个实例不是更简单明了,我就把对其概念上的讲解以注释的方式写在代码注释中,如下所示:<br />//首先我们需要先定义一个接口为:抽象观察者<br />public interface Watcher{<br /> //再定义一个用来获取更新信息接收的方法<br /> public void updat

android应用开发详解 2193

0欧电阻、电感、磁珠单点接地时有什么区别?

0欧电阻、电感、磁珠单点接地时有什么区别? #电阻,#电感,#磁珠 一、0欧姆电阻 重点介绍:模拟地和数字地单点接地。 只要是地,最终都要接到一起,然后入大地。如果不接在一起就是“浮地”,存在压差,容易积累电荷,造成静电。地是参考0电位,所有电压都是参考地得出的,地的标准要一致,故各种地应短接在一起。 人们认为大地能够吸收所有电荷,始终维持稳定,是最终的地参考点。虽然有些板子没有接大地,但发电厂是接大地的,板子上的电源最终还是会返回发电厂入地。如果把模拟地和数字地大面积直...

FAguangdeer的博客 448

android学习-多文件下载以及断点续传

首先先感谢丰神,本文源于他的这篇微博http://blog.youkuaiyun.com/cfy137000/article/details/54838608,思路很棒,然后自己跟着代码撸了一遍,然后为了加深理解就上传到博客上来。 首先说下主要都到了什么开发技术吧,网络请求是使用okhttp,然后涉及多线程的部分是使用rxjava,之前自己只是简单的看了一下rxjava,然后实际运用了下,感觉熟悉了很多;然后

thankYouLikeMe的博客 1230

车道线检测1.0(Python+Opencv基础版)

车道线检测是指在道路上自动检测和识别车道线的过程。车道线是道路上的标记,用于指示车辆行驶的方向和位置。 通过对车道线进行检测和识别,自动驾驶和智能驾驶系统可以实现车辆的自动导航、车道保持、车道偏离警告等功能。

Dream_orz的博客 4264

osgEarth添加线特征

部分关键代码: osgEarth::Annotation::FeatureNode* pathNode = 0; osgEarth::Symbology::Geometry* path = new osgEarth::Symbology::LineString(); Track*track = dynamic_cast<Track*>(entity->getProperty(PS_TRACK)); if (track == nullptr) { return; } st.

wb175208的专栏 2968

设计模式(JAVA)——Observer模式

设计模式java之Observer模式,观察者模式。发布-订阅

读书 好学 求知 642

数控系统(CNC)系列:Fanuc 31i-B_(16).CNC系统的网络连接与数据传输

硬件连接:包括网络接口的类型、连接方式等。网络协议:常用的网络协议包括Ethernet、Modbus TCP、Profinet等。网络配置:如何在CNC系统中配置网络参数,使其能够正确接入网络。在网络化的现代工业生产环境中,CNC系统的网络连接和数据传输能力变得越来越重要。通过以太网、Modbus TCP和Profinet等网络协议,可以实现CNC系统与上位机、其他CNC系统以及各种工业设备之间的高效通信。

2401_87715305的博客 2435

Observer模式

观察者设计模式简介

qq_63612259的博客 941

基于R-CNN深度学习的常见手势识别系统:数据集、模型和UI界面的完整实现

卷积神经网络(CNN):用于从图像中提取特征。区域提议网络(RPN):用于生成可能包含手势的候选区域。:将候选区域调整为固定大小,并进行进一步的分类和回归。接下来,我们需要加载一个预训练的Faster R-CNN模型,并对其进行微调。我们将使用# 加载预训练的Faster R-CNN模型# 获取分类器的输入特征数# 替换分类器头部,设置为我们数据集的类别数(假设有5类手势)

YOLO 1000

从零开始:使用Verilog在FPGA上实现8051微控制器的完整指南

8051微控制器是一种8位微控制器,由Intel在1980年代初推出。它包括一个CPU、一些RAM和ROM、I/O端口、定时器和串行通信接口。由于其简单的架构和强大的功能,8051已经成为了嵌入式系统设计的首选。FPGA是一种集成电路,设计师可以按照自己的需求进行编程。与传统的ASIC(应用特定集成电路)相比,FPGA提供了更高的灵活性,允许在硬件级别进行快速原型设计和迭代。这里,我们定义了一些基本的输入/输出端口,如时钟clk、复位reset、数据输入/输出和地址输入/输出。

qq_38334677的博客 1332

Observer 模式

Observer 模式 Observer模式的意思是“进行观察的人”,也就是“观察者”的意思。 在Observer模式中,当观察对象的状态发生变化时,会通知给观察者。Observer模式适用于根据对象状态进行相应处理的场景。 示例程序 类和接口的一览表 名字 说明 Observer 表示观察者的接口 NumberGenerator 表示生成数值的对象的抽象类 RandomN...

stepMore的博客 817

SAP GUI 字段遮罩功能详解及实现

默认情况下,系统使用作为掩码模式,遮罩整个字段内容长度;对于货币金额类型,掩码后会保留小数位并在整数位部分全部显示为,如****.**若需自定义掩码模式,可利用以下方式:维护“Maintain Masking Pattern”节点,在其中定义新的掩码方式(如:只露出后四位,其他位以X替代等);实现 BAdI(或类似命名,具体以系统版本为准)的方法,通过 ABAP 代码读取原始值,并依据业务逻辑生成掩码字符串返回,动态替换界面输出值;

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 709

使用js实现observer模式

在yui中,大量使用customEvent。何为customEvent,实际就是一个观察者observer。下面给出这个observer的实现html>    head>        meta http-equiv="Content-Type" content="text/html; charset=GB2312" />        title>实现Observer模式.title> 

kent的专栏 6080

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Observer模式的一个例子

observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。JDK里提供的observer设计模式的实现由java.util.Observable类和java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(sub

小小冰的专栏 1406

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

我认识的Observer 模式

GoF说道:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。从这段话里我们可以得到两个信息,如下: 1, 观察者(具体执行操作的对象,有多个) 2, 被观察者(被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操作)在java的util包中实现了该设计模式的框架,大部分应用都可以直接用它,当然了你也

hjxhjh的专栏 723

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

[设计模式]Observer观察者模式

问题 Observer模式应该可以说是应用最多,影响最广的模式之一,因为Observer的一个实例Model/View/Control(MVC)结构在系统开发架构设计中有着很重要的地位和意义,MVC实现了业务逻辑和表示层的解耦。在MFC中,Doc/View(文档视图结构)提供了实现MVC的框架结构。还有在事件处理系统中也经常用到,事件分发机制就是采用的观察者模式。观察者模式是实现解耦的一种方法,...

超越 3039

「软件设计模式」观察者模式(Observer)

通过本文的详细讲解和代码示例,读者可以深入理解观察者模式的核心思想,掌握其在C++中的实现方法。该模式在需要建立对象间动态、松耦合关系的场景中具有重要价值,合理运用可以显著提升系统的灵活性和可维护性。后续文章我们将继续探讨其他设计模式的实现与应用。观察者模式(Observer)是一种行为型设计模式,它建立了对象间的一对多依赖关系。当被观察对象(Subject)状态发生变化时,它会自动通知所有观察者(Observer)对象,形成松耦合的交互机制。

ThereIsNoCode 1155

设计模式17——Observer设计模式

Observer观察者设计模式用于将对象的变化通知给感兴趣的用户。在Observer模式中的角色为主题(subject)与观察者(observer),观察者订阅它感兴趣的主题,一个主题可以被多个观 察者订阅,当主题的状态发生变化时,它必须通知(notify)所有订阅它的观察者,观察者检视主题的状态变化,并作出对应的动作,所以Observer模式也称之为Publish-Subscribe模式。 Ob

Tony Chen的专栏 1656

设计模式 - C++ - Observer模式

设计模式 - C++ - Observer模式

trojanpizza的专栏 4839

观察者模式:解耦与通知机制在软件设计中的核心应用

在软件架构中,解耦是提升系统可维护性和扩展性的关键设计原则。观察者模式通过定义一种订阅-发布机制,实现了对象间一对多的依赖关系解耦,其核心原理在于将状态持有者与状态响应者分离,通过抽象接口进行间接通信。这一模式的技术价值在于支持运行时动态建立关系,符合开闭原则和单一职责原则,能有效避免代码臃肿。其典型应用场景广泛,包括事件驱动系统、GUI编程、消息中间件以及微服务架构中的最终一致性实现。例如,在电商系统中,订单状态变更可自动通知库存、物流等多个服务,这正是观察者模式在分布式事务和松耦合设计中的实践体现。

cuibinmo3519的博客 475

Observer设计模式

Observer模式 一、Observer设计模式初步描述 1.1 问题 Observer模式应该可以说是应用最多、影响最广的模式之一,因为Observer的一个实例Model/View/Control(MVC)结构在系统开发架构设计中有着很重要的地位和意义,MVC实现了业务逻辑和表示层的解耦。个人也认为Observer模式是软件开发过程中必须要掌握和使用的模式之一。在MFC中,Do

勇敢无畏的活着 1225

设计模式(八)【Observer模式】

Observer模式 《设计模式》分类 分类 意图 例子 用途 创建型 创建或实例化对象 Abstract FactorySingletonDouble-Checked LockingFactory Method 实例化对象 结构型 将已有的对象组合起来 FacadeAdapterBridge 处理接口将实现与抽象联系起来 行为型 给出一种提供灵活(变化)行为的方式 Str...

xiaowei_innocence的博客 523

设计模式之Observer模式[转载]

写这篇文章主要想总结自己的工作经验,温故而知新。为什么叫做实用设计模式,所谓的实用模式就是说这些模式在本人的实际工作中使用过的,而且本人相对熟悉的,经验认为这些模式的使用能给系统带来有效改善。这些模式大部分来源于GoF,由于最近工作专注于移动的开发,因此会尽量使用移动开发的例子。  由于一直做监控程序的开发,对Observer模式的感受比较深,现在从一个例子入手,假如需求是实现一套手机...

156

Behavioral模式之Observer模式

1.意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。2.别名依赖(dependents),发布-订阅(Publish-Subscribe)3.动机将一个系统分割成一系列相互协作的类,有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使得个类之间紧密耦合,因此这样降低了他们的可重用性。4.适用性以下情况使用ObServ

feiyangxiaomi的专栏 870
上一篇: Tomcat 源码分析[1]
下一篇: 领先的易物网站-舍得网基于J2ee Resin实现的技术内幕
NationSoftware
博客等级 码龄18年 2粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值