`

Java设计模式之Observer

阅读更多
1.概念
observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(subject)角色。
2.实例
该实例模拟了烧水的过程,涉及三个对象,Heater(热水器),Display(显示器),Alarm(报警器).
   模拟过程:为了便于运行,水的初始化温度为90,沸点为95,显示器依据热水器显示温度,显示器显示温度为95时,报警器开始报警。明显可以看出Heater是subject ,Display 是它的 Obsrver,同时Display亦是suject,因为它要被报警器观察,所以Alarm是Display的Observer.
   实现过程:
a.Heater.java
import java.util.Observable;

public class Heater extends Observable {

	private int temperature;

	public int getTemperature() {
		return temperature;
	}
	public void setTemperature(int temperature) {
		this.temperature = temperature;
	}
	public void boilWater() {
		for (int i = 90; i < 100; i++) {
			temperature = i;
			this.setChanged();
			this.notifyObservers();
		}
	}
}

b.Display.java
import java.util.Observable;
import java.util.Observer;

public class Display extends Observable implements Observer {

	private String status = "未开";

	public void setStatus(String status) {
		this.status = status;
	}
	public void displayTemputer(int temperature) {
		if (temperature > 95) {
			this.setStatus("沸腾");
			this.setChanged();
			this.notifyObservers();
		}
		System.out.println("状态:" + status + " 现在温度:" + temperature + "");
	}
	public void update(Observable o, Object arg) {
		displayTemputer(((Heater) o).getTemperature());//这里不是很好
	}
}

c.Alarm.java
import java.util.Observable;
import java.util.Observer;

public class Alarm implements Observer {

	public void makeAlarm() {
		System.out.println("嘀嘀嘀...水已经烧开 ");
	}
	public void update(Observable o, Object arg) {
		makeAlarm();
	}
}

d.测试类testObserver.java
public class testObserver {

	public static void main(String[] args) {
		Heater header = new Heater();
		Display display = new Display();
		Alarm alarm = new Alarm();
		header.addObserver(display);
		display.addObserver(alarm);
		header.boilWater();
	}
}

e.运行结果:
引用
状态:未开 现在温度:90
状态:未开 现在温度:91
状态:未开 现在温度:92
状态:未开 现在温度:93
状态:未开 现在温度:94
状态:未开 现在温度:95
嘀嘀嘀...水已经烧开
状态:沸腾 现在温度:96
嘀嘀嘀...水已经烧开
状态:沸腾 现在温度:97
嘀嘀嘀...水已经烧开
状态:沸腾 现在温度:98
嘀嘀嘀...水已经烧开
状态:沸腾 现在温度:99

3.总结, 观察者模式的应用场景:

1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。

2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。

观察者模式的优点:

1、 Subject和Observer之间是松偶合的,分别可以各自独立改变。

2、 Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。

3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

观察者模式的缺陷:

1、 松偶合导致代码关系不明显,有时可能难以理解。(废话)

2、 如果一个Subject被大量Observer订阅的话,在广播通知的时候可能会有效率问题。(毕竟只是简单的遍历)
分享到:
评论
10 楼 litianyi520 2010-01-31  
例子有点别扭,不够典型
9 楼 ianzhang 2009-11-19  
<p><br>observer模式定义对象间的<span style="background-color: #ffff00;">一对多</span>的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动 <br><br><br><span style="font-size: medium;"><strong><span style="color: #ff0000;">如果多个对象更新后需要通知另外一个对象,算什么模式?</span></strong></span></p>
<p> </p>
8 楼 peirubing 2009-11-02  
学习了。。。
7 楼 xucunliang 2009-10-09  
同意ziyu_1的观点
6 楼 zjutsoft 2009-09-16  
这个设计模式。比较实用
5 楼 achui_1980 2009-09-15  
学习了,一直对这个不是很理解
4 楼 ziyu_1 2009-07-24  
public void update(Observable o, Object arg) {   
        displayTemputer(((Heater) o).getTemperature());//这里不是很好   
    }


在调用通知的时候,
直接把变化的温度传过去,
这样在上面的代码就不用把o强制转换成Heater,arg就是传过来的温度了.
达到这两个对象解耦的作用

修改如下
public void boilWater() {   
        for (int i = 90; i < 100; i++) {   
            temperature = i;   
            this.setChanged();   
            this.notifyObservers(temperature);   
        }   
    }


public void update(Observable o, Object arg) {   
        displayTemputer(arg);//这里不是很好   
    }


3 楼 ziyu_1 2009-07-24  
报警器监视显示器,这个不太合理吧.报警器应该直接监视温度
显示器,报警器都是监视者,被监视的只有加热器(温度)
2 楼 xu_zh_h 2009-07-24  
如果把热水器换成温度测量器,再增加一个水,让水、显示器、报警器都是观察者。温度计是目标
1 楼 case0079 2009-02-26  
本来就不合适有大量Observer的.

相关推荐

    java设计模式之Observer参考.pdf

    Observer模式,也称为发布-订阅(Publish/Subscribe)模式,是一种行为设计模式,它允许对象在状态发生改变时通知其他对象,而无需显示地指定这些对象。在Java中,Observer模式通过`java.util.Observable`和`java....

    java设计模式之Observer[整理].pdf

    在Java编程中,设计模式是一种经过实践验证的解决常见问题的模板,能够提高代码的可读性、可维护性和复用性。Observer(观察者)模式是设计模式中的一种,常用于实现对象之间的依赖关系,当一个对象的状态发生改变时...

    JAVA设计模式chm文档

    设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    Java设计模式 设计模式介绍

    1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    Java设计模式是软件工程中的一种最佳实践,它总结了在特定场景下解决常见问题的经验,为程序员提供了可重用的解决方案。本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与...

    设计模式之Observer

    《设计模式之Observer》 设计模式是软件工程中的一种最佳实践,它们是在特定场景下解决常见问题的经验总结。Observer模式,又称为“观察者模式”或“发布-订阅模式”,是一种行为设计模式,用于在对象之间建立一种...

    《Java设计模式》课后答案-刘伟.rar

    《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...

    java设计模式期末考试选择题100道

    适合Java设计模式期末考试选择题复习,形式如下: 10.(单选题)Facade(外观)模式的意图是 正确答案: A A.希望简化现有系统的使用方法,你需要定义自己的接口 B.将一个无法控制的现有对象与一个特定借口相匹配。 C....

    23种java设计模式.pdf

    " JAVA 设计模式概述" JAVA 设计模式是指在软件设计过程中,为了提高代码的可维护性、灵活性和可扩展性所使用的一些惯用解决方案。JAVA 设计模式可以分为三种:创建模式、结构模式和行为模式。 1. 创建模式 创建...

    Java设计模式刘伟书本中模拟考试答案

    在《Java设计模式》这本书的模拟试题及其参考答案中,涉及了多条设计模式的知识点,以及它们的应用场景和实现方法。现在将这些知识点详细地解释如下: 1. 开闭原则(Open-Closed Principle, OCP): 开闭原则是面向...

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

    JAVA设计模式(chm版)

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以被复用在各种不同的软件系统中。这个"JAVA设计模式(chm版)"是一个关于Java设计模式的电子书,采用CHM(Microsoft Compiled ...

    Observer设计模式实例

    Observer设计模式,也被称为“发布-订阅”(Publish-Subscribe)模式或“依赖倒置”模式,是软件设计中的一种行为模式。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

    java设计模式.pdf

    Java设计模式是面向对象编程领域中的重要概念,它是一套被广泛接受并实践的解决软件设计问题的经验总结。设计模式并非具体的代码或库,而是一种描述在特定情况下,如何设计和实现软件组件的经典方法。这些模式是经过...

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    java设计模式PPT

    Java设计模式是软件工程中的一种最佳实践,它是一种在特定情境下解决常见问题的经验总结。这份"java设计模式PPT"资源提供了系统化的学习材料,旨在帮助开发者提升编程思维,理解如何有效地组织代码,提高软件的可...

    Java 设计模式最佳实践

    Java 设计模式最佳实践是软件开发中的重要主题,它涵盖了多种模式,这些模式已被广泛接受并应用于实际项目中,以解决常见的编程问题和提升代码的可读性、可维护性和可扩展性。在这个主题中,我们将深入探讨一些关键...

    java设计模式高清教程

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可重用性、灵活性和可维护性。本高清教程深入浅出地讲解了Java中的各种设计模式,对于提升开发者的技术能力和面试表现...

Global site tag (gtag.js) - Google Analytics