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

简介:
观察者模式在Java中有两种实现方式,上文是一种方式,这种方式是自己写代码实现。
另一种方式是使用Java内置的观察者模式来实现。
 
相关的接口和类如下:
java.util.Observable   主题(可观察者)------class
java.util.Observer       观察者                     -------interface
 
 
相关的API如下:
1、java.util.Observable
Observable() 
          构造一个带有零个观察者的 Observable。 
方法摘要 
void addObserver(Observer o) 
          如果观察者与集合中已有的观察者不同,则向对象的观察者集合中添加此观察者。 
protected  void clearChanged() 
          指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 false。 
 int countObservers() 
          返回 Observable 对象的观察者数目。 
 void deleteObserver(Observer o) 
          从对象的观察者集合中删除某个观察者。 
 void deleteObservers() 
          清除观察者列表,使此对象不再有任何观察者。 
 boolean hasChanged() 
          测试对象是否改变。 
 void notifyObservers() 
          如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。 
 void notifyObservers(Object arg) 
          如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。 
protected  void setChanged() 
          标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。
 
2、java.util.Observer
void update(Observable o, Object arg) 
          只要改变了 observable 对象就调用此方法。
 
观察API可以发现, java.util.Observable已经对观察者进行管理了,不再需要主题追踪每个观察者了。
 
下面通过Java的内置的观察者模式来重写上个天气应用,部分类代码如下:
import java.util.Observable; 

public  class WeatherData  extends Observable { 
         private  float temperature; 
         private  float humidity; 
         private  float pressure; 

         public WeatherData() { 
        } 

         /** 
         * 测量值改变了 
         */
 
         public  void measurementsChanged() { 
                setChanged();              //设定改变了 
                notifyObservers();     //通知所有的观察者 
        } 

         /** 
         * 重新设定了测量值 
         */
 
         public  void setMeasurements( float temperature,  float humidity,  float pressure) { 
                 this.temperature = temperature; 
                 this.humidity = humidity; 
                 this.pressure = pressure; 
                measurementsChanged(); 
        } 

         public  float getTemperature() { 
                 return temperature; 
        } 

         public  float getHumidity() { 
                 return humidity; 
        } 

         public  float getPressure() { 
                 return pressure; 
        } 
}
 
public  interface DisplayElement { 
         public  void display(); 
}
 
import java.util.Observable; 
import java.util.Observer; 

public  class CurrentConditionsDisplay  implements Observer, DisplayElement { 
        Observable observable; 
         private  float temperature; 
         private  float humidity; 

         public CurrentConditionsDisplay(Observable observable) { 
                 this.observable = observable; 
                observable.addObserver( this); 
        } 

         public  void update(Observable obs, Object arg) { 
                 if (obs  instanceof WeatherData) { 
                        WeatherData weatherData = (WeatherData) obs; 
                         this.temperature = weatherData.getTemperature(); 
                         this.humidity = weatherData.getHumidity(); 
                        display(); 
                } 
        } 

         public  void display() { 
                System.out.println( "Current conditions: " + temperature 
                                +  "F degrees and " + humidity +  "% humidity"); 
        } 
}
 
看上面的代码,
java.util.Observable不是接口,是类,如果一个类想具有另一个超类的功能,同时还想拥有 Observable行为,就陷入两难地步。
 
实际上,Java内部使用观察者模式也很多,GUI的事件就是典型的观察者模式。


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/201633,如需转载请自行联系原作者
相关文章
|
设计模式 监控 Java
Kotlin - 改良设计模式 - 观察者模式
Kotlin - 改良设计模式 - 观察者模式
299 3
|
11月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
9月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
657 8
|
设计模式 存储 供应链
前端必须掌握的设计模式——观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,实现了一种订阅机制。它包含两个角色:**观察者**(订阅消息、接收通知并执行操作)和**被观察者**(维护观察者列表、发送通知)。两者通过一对多的关系实现解耦,当被观察者状态改变时,会通知所有订阅的观察者。例如,商店老板作为被观察者,记录客户的需求并在商品到货时通知他们。前端应用中,如DOM事件注册、MutationObserver等也体现了这一模式。
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
|
设计模式 传感器
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
314 0
|
设计模式 消息中间件 存储
【设计模式】【行为型模式】观察者模式(Observer)
一、入门 什么是观察者模式? 观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。
544 9
|
设计模式 消息中间件 存储
设计模式:观察者模式
观察者模式属于行为型设计模式,用于建立对象间的一对多依赖关系。当主题(Subject)状态变化时,所有依赖的观察者(Observer)会自动收到通知并更新。
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
368 6

热门文章

最新文章