设计模式-观察者模式(下)<转>

观察者模式在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的事件就是典型的观察者模式。

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/201633

时间: 2024-10-20 17:10:25

设计模式-观察者模式(下)<转>的相关文章

【转】设计模式-观察者模式

设计模式-观察者模式 定义 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或 从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各 观察者所提供的方法来实现.此种模式通常被用来实现事件处理系统. 基本简介 观察者模式(Observer)完美的将观察者和被观察的对象分离开.举个例子,用户界面可以作为一个观察者,业务 数据是被观察

学习设计模式--观察者模式(C++)

1. 说说简单的函数回调 首先说说一种简单的函数回调机制(一种通过获取对象的指针来进行函数的调用方法)以下是代码演示--- 这是观察者(被回调)部分: class Observer { public: // 抽象观察者的纯虚函数 virtual void UpdateMessage() = 0; }; class ConcreteObserver : public Observer { public: // 实现抽象类的纯虚函数 void UpdateMessage(); } void Conc

换种思路去理解设计模式(下)

开写之前,先把前两部分的链接贴上.要看此篇,不许按顺序看完前两部分,因为这本来就是一篇文章,只不过内容较多,分开写的. 换种思路去理解设计模式(上) 换种思路去理解设计模式(中) 8       对象行为与操作对象 8.1     过程描述 所谓对象行为和操作对象,需要三方面内容: l  操作过程: 一般表现为一个方法.该方法接收一个对象或者组合类型的参数,然后对这个对象或者组合进行操作,例如修改属性.状态或者结构等. l  操作的对象或组合: 会作为实参传入操作过程,会被操作过程修改属性.状态

设计模式 - 观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权所有, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove

设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法

观察者模式(Observer Pattern) Java内置 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 观察者模式(observer pattern)详解, 参见: http://blog.csdn.net/caroline_wendy/article/details/26583157 Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数: Observerable(可被观

C#设计模式---观察者模式简单例子

在开发过程中经常遇到一个模块中的 一个方法调用了其他模块中相关的方法 比如说在一个系统中,如果出现了错误,就调用专门进行错误处理的模块中的方法进行错误处理 而因为错误处理的操作有很多,所以将这些具体的操作封装在其他的模块中 在专门进行错误处理的模块中调用其他模块中的错误操作方法 这样一来在主系统中只要实例化专门进行错误处理的模块对象 并调用其相关的方法,其他模块中的具体方法也都会被执行 这时专门进行错误处理的模块被称为发布者 其他拥有具体错误操作的模块称为订阅者 只要发布者一发布信息(方法被调用

java设计模式--观察者模式和事件监听器模式

文章转载于:http://www.java2000.net/p9452 复习设计模式,看到observer观察者模式,说法是该模式和iterator迭代器模式类似已经被整合进jdk,但是jdk提供了两种接口: 一.java.util.Observer -- 观察者接口 对应: java.util.Observable --受查者根类 二.java.util.EventListener -- 事件监听/处理接口 对应: java.util.EventObject -- 事件(状态)对象根类 研究了

大话设计模式观察者模式

从前,有个放羊娃,每天都去山上放羊,一天,他觉得十分无聊,就想了个捉弄大家寻开心的主意.他向着山下正在种田的农夫们大声喊:"狼来了!狼来了!救命啊!"农夫们听到喊声急忙拿着锄头和镰刀往山上跑,他们边跑喊:"不要怕,孩子,我们来帮你打恶狼!"农夫们气喘吁吁地赶到山上一看,连狼的影子也没有!放羊娃哈哈大笑:"真有意思,你们上当了!"农夫们生气地走了.第二天,放羊娃故伎重演,善良的农夫们又冲上来帮他打狼,可还是没有见到狼的影子.放羊娃笑得直不起腰:&q

head first 设计模式 观察者模式

Head first 设计模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新.   让主题与观察者之间松耦合 大话设计模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 设计模式:描述了如何建立这种关系.这一模式中的关键对象是  目标(subject)和观察者(observer).一个目标可以有任意数目的依赖他的观察者.一旦目标的状态发生改变,所