`
leili
  • 浏览: 179944 次
社区版块
存档分类
最新评论

Java Observable 模式

 
阅读更多

一、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 设计模式最佳实践

    在Java中,`java.util.Observer` 和 `java.util.Observable` 接口可以用来实现这个模式。 五、装饰器模式(Decorator) 装饰器模式动态地给一个对象添加一些额外的职责,为对象添加新的功能而不影响其原有结构。...

    JAVA设计模式

    Java的`java.util.Observable`和`java.util.Observer`接口就是观察者模式的实现。 7. **适配器模式(Adapter)** 适配器模式允许两个不兼容的接口协同工作。在Java中,可以使用类适配器或对象适配器模式,通过继承...

    Java设计模式入门闲谈

    在Java中,`java.util.*`包中的`Observable`类和`Observer`接口就是观察者模式的一个典型实现。例如,在实现天气预报系统时,可以使用观察者模式来更新不同类型的天气显示组件。 #### 四、装饰器模式 装饰器模式是...

    Java与模式(阎宏经典版)

    在Java中,`java.util.Observable`和`java.util.Observer`接口就是观察者模式的体现。 4. **装饰器模式**:动态地给一个对象添加一些额外的职责,增加功能而不影响其他对象。在Java IO流中,`BufferedReader`、`...

    java 设计模式详解

    Java.util.Observable和Observer接口就是观察者模式的实现。 10. 装饰模式:装饰模式动态地给一个对象添加一些额外的职责。它提供了比继承更多的灵活性,避免了因为功能增加而导致类的急剧膨胀。 以上只是部分设计...

    java设计模式(绝对高清和完整)

    Java的`java.util.Observable`和`java.util.Observer`接口实现了此模式。 13. **责任链模式**:避免请求的发送者和接收者间的耦合,将多个处理对象链接在一起,每个对象处理请求的一部分。在Java异常处理中,异常...

    java与模式源代码

    Java中,`java.util.Observable`和`java.util.Observer`接口用于实现这一模式。 4. 装饰器模式:动态地给对象添加一些额外的职责,使得增加功能更加灵活,而不会影响到其他对象。Java的IO流体系就是装饰器模式的一...

    ( java设计模式.zip

    在Java中,`java.util.Observable`和`java.util.Observer`类可以用于实现这个模式。 4. 适配器模式:适配器模式允许两个不兼容的接口之间进行通信。在Java中,这通常通过创建一个适配器类来实现,该类将原始接口...

    闫宏Java设计模式源码

    Java中Observer接口和Observable类就是这种模式的体现。 7. **装饰器模式**:动态地给一个对象添加一些额外的职责。Java的IO流类库就大量使用了装饰器模式,如BufferedInputStream和DataInputStream。 8. **适配器...

    Java 设计模式.zip

    Java的`java.util.Observable`和`java.util.Observer`接口就是实现这一模式的基础。 7. **适配器模式**:将两个不兼容的接口通过适配器进行桥接,使它们能够协同工作。在Java中,可以使用类适配器或对象适配器方式...

    Java的23种设计模式百度云下载链接.rar

    Java中的`Observer`和`Observable`接口就是观察者模式的实现。 23. **中介者模式**:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的...

    Java观察者设计模式(Observable和Observer)

    在Java中,观察者模式通过`java.util.Observable`类和`java.util.Observer`接口得以实现。 一、观察者模式介绍 观察者模式的核心在于建立一种对象间的依赖关系,这种关系使得当一个对象(被观察者)的状态发生改变...

    《java与模式》一书源代码

    在Java中,`java.util.Observable`和`java.util.Observer`接口可以用来实现这一模式。 4. **装饰器模式**:动态地给一个对象添加一些额外的职责,可以为对象增加新的功能而不影响其他对象。Java的I/O流类库就是装饰...

    java与模式(含源码)

    Java的`java.util.Observable`和`java.util.Observer`接口实现了观察者模式。 11. 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些...

    Java 与模式 pdf格式

    Java的`Observer`和`Observable`接口就是这个模式的体现。 10. **策略模式**:定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。Java的策略模式常通过...

    Java 设计模式 课件 PPT

    Java中的`java.util.Observable`和`java.util.Observer`接口就是对这一模式的实现。 桥接模式(Bridge Pattern)将抽象部分与实现部分分离,使它们可以独立变化。这有助于降低系统的耦合度,提高灵活性。 享元模式...

    java设计模式之观察者模式

    在Java中,观察者模式通常通过`java.util.Observable`和`java.util.Observer`这两个接口来实现。`Observable`类代表被观察的对象,它可以添加多个观察者,并在状态变化时通知它们。而`Observer`接口则定义了观察者的...

    Java与模式(含源码)

    Java提供了内置的`java.util.Observable`和`java.util.Observer`接口来实现这一模式。 5. **装饰器模式**:动态地给对象添加一些额外的职责,可以增加功能而不影响其他对象。Java的IO流类库广泛使用了装饰器模式,...

    《Java与模式 阎宏 摘录》.doc 更新中……

    Java中的java.util.Observable和java.util.Observer接口就是对这种模式的内置支持。 装饰器模式(Decorator Pattern)用于在运行时给对象添加新的行为或责任,它提供了比继承更灵活的扩展对象功能的方式。Java的IO...

    java 设计模式 观察者模式 简单实例 包括测试test类

    在Java中,观察者模式的实现通常基于Java的内置接口`java.util.Observer`和`java.util.Observable`。下面将详细解释观察者模式的概念、结构以及如何在Java中应用这个模式。 **观察者模式的核心概念:** 1. **主题...

Global site tag (gtag.js) - Google Analytics