一、Observer模式的意图:
在对象的内部状态发生变化时,自动通知外部对象进行响应。
二、Observer模式的构成:
·被观察者:内部状态有可能被改变,而且又需要通知外部的对象
·观察者:需要对内部状态的改变做出响应的对象
三、Observer模式的Java实现:
Java的API中已经为我们提供了Observer模式的实现。具体由java.util.Observable类和java.util.Observer接口完成。
前者有两个重要的方法:
·setChanged:设置内部状态为已改变
·notifyObservers(Object obj):通知观察者所发生的改变,参数obj是一些改变的信息
后者有一个核心方法:
·update(Object obj):相应被观察者的改变,其中obj就是被观察者传递过来的信息,该方法会在notifyObservers被调用时自动调用。
下面是Observer模式的实现过程:
·创建一个被观察者,继承java.util.Observable
·创建一个观察者,实现java.util.Observer接口
· 注册观察着,调用addObserver(Observer observer)
·在被观察者改变对象内部状态的地方,调用setChanged()方法,然后调用notifyObservers(Object)方法,通知被观察者
·在观察者的update(Object)方法中,对改变做出响应。
四、Observer模式的好处:
1.Observer模式的优点:
·被观察者只需要知道谁在观察它,无需知道具体的观察细节
·被观察者一旦发生变化,只需要通过广播的方式告知观察者,至于消息如何到达则不需知道。这样的话无疑消除了被观察者和观察者之间通信的硬编码
·当一个被观察者同时被多个观察着观察时,观察者可以只选择自己感兴趣的事件,而忽略其它的事件
·多个观察者组合起来可以形成一个观察链,如果一旦需要回滚多个操作,此时观察链可以发挥作用
·观察者可以实时对被观察对象的变化做出响应,例如自动告警、中断运行等
2.运用Observer模式可以
·屏蔽线程间的通信机制:例如两个线程之间,主线程可以作为观察者,执行线程是被观察者。彼此之间只知道对方存在,但不知道之间通信的细节
·消除硬编码:如果没有Observer模式,则只能采用回调的模式,或者在代码中显示地调用观察者
·优化异常机制:特别适合在异常发生时向顶层监控,减少try-catch代码量
代码:
在spring中使用观察者模式的方法如下
<bean id="mailObserver" class="MailObserver"/>
<bean id="jmsObserver" class="JMSObserver"/>
<bean id="subjectTarget" class="Subject"/>
<bean id="subject"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject"><ref local="subjectTarget"/></property>
<property name="targetMethod"><value>addObserver</value></property>
<property name="arguments">
<list>
<ref bean="mailObserver"/>
<ref bean="jmsObserver"/>
</list>
</property>
</bean>
观察者模式的效果有以下几个优点:
(1)观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体现察者聚集,每一个具体现察者都符合一个抽象观察者 的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象 化层次。
(2)观察者模式支持广播通信。被观察者会向所有的登记过的观察者发出通知。
观察者模式有下面的一些缺点:
(1)如果一个被观察者对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
(2)如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察考模式时要特别注意这一点。
(3)如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。
(4)虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的
分享到:
相关推荐
Java内置的Observable类和Observer接口提供了基本的观察者模式功能,你可以通过继承Observable类和实现Observer接口来使用
主要介绍了 Java观察者设计模式(Observable和Observer)的相关资料,需要的朋友可以参考下
JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标...
观察者设计模式,java语言实现,完全自己代码实现,未使用observable和observer
Java实现一个模型、两个视图和两个控制器的功能软件,即采用MVC模式或者说是观察者模式,本程序通过输入球体半径,显示球体形状,面积体积等 Sphere.java package Model; import java.util.Observable; public class...
在对象之间定义了一对多的依赖关系 这样一来 当一个对象改变状态时 依赖它的对象都会收到通知并自动跟新 Java已经提供了对观察者Observer模式的默认实现 Java对观察者模式的支持主要体现在Observable类和Observer...
java.util.Observable的黑暗面 设计箱内的工具 习题解答 …… 3 装饰者模式:装饰对象 4 工厂模式:烘烤OO的精华 5 单件模式:独一无二的对象 6 命令模式:封装调用 7 适配器模式与外观模式:随遇而安 8...
Java 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...
android 观察者模式示例代码 android studio kotlin代码 基于java.uitl.*
java.util.Observable的黑暗面 设计箱内的工具 习题解答 …… 3 装饰者模式:装饰对象 4 工厂模式:烘烤OO的精华 5 单件模式:独一无二的对象 6 命令模式:封装调用 7 适配器模式与外观模式:随遇而安 8...
java.util.Observable的黑暗面 设计箱内的工具 习题解答 …… 3 装饰者模式:装饰对象 4 工厂模式:烘烤OO的精华 5 单件模式:独一无二的对象 6 命令模式:封装调用 7 适配器模式与外观模式:随遇而安 8...
java.util.Observable的黑暗面 设计箱内的工具 习题解答 …… 3 装饰者模式:装饰对象 4 工厂模式:烘烤OO的精华 5 单件模式:独一无二的对象 6 命令模式:封装调用 7 适配器模式与外观模式:随遇而安 ...
java餐饮管理系统源码6 Head First Designer Patterns 1. 策略模式() 策略模式定义了算法簇, 分别封装起来, ...使用java.util中的Observable/Observer见 :star: 关于Observer::update(Observable o, Object a
TypeScriptPoet是Kotlin和Java API,用于生成.ts源文件。 在执行诸如批注处理或与元数据文件(例如,数据库模式,协议格式)交互之类的操作时,源文件的生成可能非常有用。 通过生成代码,您无需编写样板文件,...
手工实现一个Observer也不是多复杂的一件事,只是因为这个设计模式实在太常用了,Java就把它放到了JDK里面:Observable和Observer,从JDK 1.0里,它们就一直在那里。从某种程度上说,它简化了Observer模式的开发,...
java8集合源码#系绳 Version - 1.0.0 Kotlin - 1.2.61 Gradle Tools - 3.2.0-rc03 Min Version - 21 Compile Version - 28 已知的问题 下面的 ...生命周期-通用-java8 ...Observable 并将其连接到 UI Andr
java8 看不到源码交付 Android 应用程序 基于 MVVM 清洁架构的交付的简单演示项目。...Observable 模式的 RxJava2。 用于依赖注入的 Dagger 2。 为 API 集成改造 2。 Picasso 用于图像加载。 单元测试(Db、We
本文实例为大家分享了js观察者模式实现自动刷新的具体代码,供大家参考,具体内容如下 // author wangbinandi@gmail.com const observable = obj => { const observers = Symbol(); const set = function(target,...
SwiftPoet是Kotlin和Java API,用于生成.swift源文件。 在执行诸如批注处理或与元数据文件(例如,数据库模式,协议格式)交互之类的操作时,源文件的生成可能非常有用。 通过生成代码,您无需编写样板文件,同时...