`

观察者模式(Head First版)

 
阅读更多

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

 有这样一个需求:

一个气象站,它会提供气温,气压,湿度等气象数据,要实现一个显示当前气象状态的显示装置。

能显示当前气温、气压、湿度等。当气象站的数据一发生改变,就能通知显示装置。

使用观察者模式实现。

 

先看看观察者模式类图:

 

主题是一个接口,定义了注册观察者、删除观察者、通知方法

package com.headfirst.chapter2;

public interface Subject {//主题
	public void registerObserver(Observer o);//添加观察者
	public void removeObserver(Observer o);//删除观察者
	public void notifyObserver();//通知观察者
}

 

 

观察者也是一个接口,主题的notifyObserver方法会调用观察者的update方法。

package com.headfirst.chapter2;

public interface Observer {//观察者
	public void update(float temp,float humidity,float pressure);
}

 

根据上面的需求,我们实现具体的主题,代码如下:

package com.headfirst.chapter2;

import java.util.ArrayList;
import java.util.List;

public class WeatherDataSubject implements Subject {
	private float temp;// 温度
	private float humidity;// 温度
	private float pressure;// 气压
	private List observers;// 这个列表用于存入观察者

	public WeatherDataSubject() {
		observers = new ArrayList();
	}

	public void registerObserver(Observer o) {
		observers.add(o);
	}

	public void removeObserver(Observer o) {
		int i = observers.indexOf(o);
		if (i >= 0) {
			observers.remove(i);
		}
	}

	public void notifyObserver() {
		for (int i = 0; i < observers.size(); i++) {
			Observer observer = (Observer) observers.get(i);
			observer.update(temp, humidity, pressure); //依次通知观察者
		}
	}

	public void measurementChanged() {
		notifyObserver();
	}

	public void setMeasurements(float temp, float humidity, float pressure) {
		this.temp = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementChanged();
	}
}

 

 

观察者

package com.headfirst.chapter2;

public class CurrentConditionDisplay implements Observer {
	private float temp;
	private float humidity;
	private float pressure;

	public CurrentConditionDisplay(Subject weatherDataSubject) {
		weatherDataSubject.registerObserver(this);
	}

	public void update(float temp, float humidity, float pressure) {
		this.temp = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		display();
	}

	public void display() {//显示方法 
		System.out.println("temp = "+temp+",humidity = "+humidity+", pressure = "+pressure);
	}

}

 

测试类

package com.headfirst.chapter2;

public class Test {
	public static void main(String[] args) {
		WeatherDataSubject subject = new WeatherDataSubject();
		Observer observer = new CurrentConditionDisplay(subject);
		subject.setMeasurements(32, 11, 420);
	}
}

 

使用JAVA内置的观察者模式

JAVA的util包中提供了内置的观察者模式API,分别是Observable类和Observer接口。

 

它可以使用推或拉的方式传输数据。

其中setChanged()方法用来标识状态是否已经改变的事实,如果调用notifyObservers()方法前没有先调用setChanged方法,那么观察都就不会被通知。

setChanged方法可以在更新观察者时,有更多弹性,可以适当通知观察者,例如气象站很敏锐,每十分之一度就会更新,这会造成显示装置不断被通知。

我们可以通过setChanged方法将通知频度设为一度通知更新一次。

把上面的例子使用内置观察者模式重写一遍:如下

package com.headfirst.chapter2;

import java.util.Observable;
//主题
public class WeatherData extends Observable {
	private float temp;// 温度
	private float humidity;// 温度
	private float pressure;// 气压

	public void measureChanged() {
		setChanged();
		notifyObservers();
	}

	public void setMeasurement(float temp, float humidity, float pressure) {
		this.temp = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		measureChanged();
	}

	public float getTemp() {
		return temp;
	}

	public float getHumidity() {
		return humidity;
	}

	public float getPressure() {
		return pressure;
	}

}

 

package com.headfirst.chapter2;

import java.util.Observable;
import java.util.Observer;
//观察者
public class ConditionDisplay implements Observer {
	private float temp;
	private float humidity;
	private float pressure;
	
	public ConditionDisplay(Observable o) {
		o.addObserver(this);
	}
	
	public void update(Observable arg0, Object arg1) {
		if(arg0 instanceof WeatherData){
			WeatherData data = (WeatherData)arg0;
			this.temp = data.getTemp();
			this.humidity = data.getHumidity();
			this.pressure = data.getPressure();
			display();
		}
	}
	
	public void display(){
		System.out.println("temp = "+temp+",humidity = "+humidity+", pressure = "+pressure);
	}

}

 

测试类:

package com.headfirst.chapter2;

import java.util.Observer;

public class Test {
	public static void main(String[] args) {
		WeatherData data = new WeatherData();
		Observer observer = new ConditionDisplay(data);
		data.setMeasurement(23, 411, 89);
	}
}

 

分享到:
评论

相关推荐

    Head First 之之观察者模式

    《Head First 之观察者模式》是一本深入浅出介绍观察者模式的书籍,通过生动有趣的方式帮助读者理解和掌握这一设计模式。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生...

    HeadFirst 设计模式学习笔记2--观察者模式 demo

    HeadFirst的设计模式系列书籍以其直观易懂的方式深受程序员喜爱,本笔记将深入探讨观察者模式的概念及其应用。 观察者模式的核心思想是定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的...

    [行为模式]head first 设计模式之观察者模式(observer)

    在Head First的设计模式系列书籍中,作者通过易懂且生动的方式介绍了观察者模式。观察者模式的核心思想是“发布-订阅”机制,它将观察目标(被观察者)和观察者(订阅者)解耦,使得两者可以独立地变化。这种模式的...

    head first 设计模式 观察者模式 C++ 代码

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多...在`head first 设计模式`的讲解中,读者将能深入理解如何在C++中有效地应用观察者模式,并掌握其在实际项目中的使用技巧。

    Head First 设计模式 +Java设计模式(第2版)

    这本书通过丰富的图像、故事和幽默的方式,引导读者了解23种经典的GoF(Gang of Four)设计模式,包括单例模式、工厂模式、观察者模式、装饰器模式、适配器模式、代理模式等。书中强调了如何在实际项目中选择和应用...

    Headfirst设计模式中文高清PDF+附书源码

    3. **观察者模式**(Observer):定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。Java中的`java.util.Observable`和`java.util.Observer`接口就是这种...

    《HeadFirst设计模式》观察者模式c++实现代码

    观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 Observer Pattern defines a one-to-many dependency between objects so that when one object ...

    HeadFirst设计模式英文版

    《Head First 设计模式》的英文版是一本面向初学者的设计模式入门书籍,它以幽默风趣的文风,深入浅出地介绍了软件设计中经常使用的设计模式。设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的...

    Head First Design Patterns 英文版 Head First设计模式

    行为型模式如策略(Strategy)、观察者(Observer)、装饰器(Decorator)和模板方法(Template Method)等,则关注对象间的行为协作。 每章结束时,书中还包含了要点整理和习题,帮助读者复习和巩固知识点。通过...

    Head First设计模式和HeadFirst in java 源码以及23种设计模式关系图

    行为型模式涉及对象间的交互和责任分配,包括模板方法模式(Template Method)、观察者模式(Observer)、策略模式(Strategy)、职责链模式(Chain of Responsibility)、命令模式(Command)、迭代器模式...

    [中文]Head-First设计模式.pdf

    11. 观察者模式:定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。Java中,`java.util.Observer` 和 `java.util.Observable` 类就是观察者模式的实现。 ...

    Head First设计模式中文版

    5. **观察者模式**:也称为发布-订阅模式,定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 6. **装饰器模式**:允许向一个对象动态地添加新的行为或责任...

    head first 设计模式例子源代码 c++版 第二章 观察者模式

    最近在看head first 设计模式,书上的例子是用java编写的.因为工作上C用的比较多,所以决定编看书,边用C++也编写书上的例子.既可以加深对设计模式的理解,也顺便练习下c++. 希望这写代码也能帮助别人学习c++和设计模式...

    HeadFirst设计模式PPT

    此外,观察者模式的讲解可能包含了事件驱动编程的基本原理,以及如何在Java或C#等语言中实现观察者模式。 总的来说,《HeadFirst设计模式》的PPT课件是学习设计模式的宝贵资源,它以易于理解的方式呈现了复杂的概念...

    head first 设计模式 高清完整版 pdf

    行为型模式则主要处理对象之间的交互和责任分配,例如策略模式(Strategy)、观察者模式(Observer)和职责链模式(Chain of Responsibility)等,它们有助于实现灵活、可扩展的行为。 《Head First设计模式》书中...

    HeadFirst设计模式JAVA版源码

    - 观察者模式(Observer):定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 - 策略模式(Strategy):定义了一系列算法,并将每个算法封装起来,使...

    HeadFirst Design Patterns深入浅出设计模式 英文PDF版

    观察者模式常用于事件驱动编程。 19. **模板方法模式**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 20. **访问者模式**:表示一个...

    Head First 设计模式 扫描版

    行为型模式则关注对象间的责任分配和交互,例如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录...

    Head First设计模式(高清版)

    3. **观察者模式**:也称为发布-订阅模式,它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 4. **装饰器模式**:动态地给一个对象添加一些额外的...

    Head First设计模式-中文版

    行为型模式中的观察者模式,又称为发布/订阅模式,它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动编程和实时系统中。 ...

Global site tag (gtag.js) - Google Analytics