`
liuwenbo200285
  • 浏览: 13018 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

转载-设计模式之观察者模式

阅读更多

                                                            观察者模式

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

Java代码 复制代码
  1. import java.util.Observable;   
  2.   
  3. public class Heater extends Observable {   
  4.   
  5.     private int temperature;   
  6.   
  7.     public int getTemperature() {   
  8.         return temperature;   
  9.     }   
  10.     public void setTemperature(int temperature) {   
  11.         this.temperature = temperature;   
  12.     }   
  13.     public void boilWater() {   
  14.         for (int i = 90; i < 100; i++) {   
  15.             temperature = i;   
  16.             this.setChanged();   
  17.             this.notifyObservers();   
  18.         }   
  19.     }   
  20. }  
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

Java代码 复制代码
  1. import java.util.Observable;   
  2. import java.util.Observer;   
  3.   
  4. public class Display extends Observable implements Observer {   
  5.   
  6.     private String status = "未开";   
  7.   
  8.     public void setStatus(String status) {   
  9.         this.status = status;   
  10.     }   
  11.     public void displayTemputer(int temperature) {   
  12.         if (temperature > 95) {   
  13.             this.setStatus("沸腾");   
  14.             this.setChanged();   
  15.             this.notifyObservers();   
  16.         }   
  17.         System.out.println("状态:" + status + " 现在温度:" + temperature + "");   
  18.     }   
  19.     public void update(Observable o, Object arg) {   
  20.         displayTemputer(((Heater) o).getTemperature());//这里不是很好   
  21.     }   
  22. }  
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

Java代码 复制代码
  1. import java.util.Observable;   
  2. import java.util.Observer;   
  3.   
  4. public class Alarm implements Observer {   
  5.   
  6.     public void makeAlarm() {   
  7.         System.out.println("嘀嘀嘀...水已经烧开 ");   
  8.     }   
  9.     public void update(Observable o, Object arg) {   
  10.         makeAlarm();   
  11.     }   
  12. }  
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

Java代码 复制代码
  1. public class testObserver {   
  2.   
  3.     public static void main(String[] args) {   
  4.         Heater header = new Heater();   
  5.         Display display = new Display();   
  6.         Alarm alarm = new Alarm();   
  7.         header.addObserver(display);   
  8.         display.addObserver(alarm);   
  9.         header.boilWater();   
  10.     }   
  11. }  
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订阅的话,在广播通知的时候可能会有效率问题。(毕竟只是简单的遍历)

分享到:
评论

相关推荐

    设计模式 观察者 发布/订阅 Observer

    Observer (观察者模式) 又叫做发布/订阅(Publish/Subscribe)模式。 当一个对象的改变同时会影响其他对象的行为的时候,可以使用此设计模式。 l 主题对象 :一个需要被关注的主题对象,这个主题对象改变会影响...

    观察者模式(发布-订阅)(转载含实例)

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计模式中的行为模式之一,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。...

    二十三种设计模式【PDF版】

    设计模式之 Observer(观察者) 介绍如何使用 Java API 提供的现成 Observer 设计模式之 Iterator(迭代器) 这个模式已经被整合入Java的Collection.在大多数场合下无需自己制造一个Iterator,只要将对象装入...

    android设计模式详解转载

    4. 观察者模式(Observer模式):定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Android中,BroadcastReceiver和ContentObserver就是观察者模式的体现...

    Java23种设计模式

    7. 观察者模式(Observer):对象间的一对多依赖关系,当一个对象改变状态时,所有依赖者都会收到通知,并自动更新。 适用场景:当一个抽象模型有两个方面,其中一个方面依赖于另一个方面;当对一个对象的改变需要...

    转载:软件开发者面试百问

    - 设计模式:如工厂模式、观察者模式等,它们在解决常见问题时提供了一种标准解决方案。 - 无状态业务层:理解其含义并讨论长事务的处理方式。 - 架构图:如用例图、类图、序列图等,用于表示系统组件及其相互...

    悠索科技高校教务管理系统(转载)

    5. **设计模式**:系统可能应用了诸如工厂模式、单例模式、观察者模式等设计模式,以实现良好的代码结构和可扩展性。 6. **权限控制与安全**:考虑到教务管理系统涉及敏感信息,系统可能包含了用户角色、权限分配等...

    Java版水果管理系统源码-AndroidGenericFramework:Android通用框架

    Vlissides这四位大牛在讨论设计模式中的观察者模式时的想法;Trygve Reenskaug在1979年5月的时候发表了一篇文章叫做Thing-Model-View-Editor,这篇文章中虽然没提到Controller,但是他提到的Editor就是非常接近这个...

    Java面试题

    8. **设计模式**:常见的设计模式如单例模式、工厂模式、建造者模式、观察者模式、适配器模式等,以及在实际开发中的应用。 9. **JVM优化**:了解JVM内存模型(堆、栈、方法区等),垃圾回收机制(GC),以及如何...

    Java面试资料大集合

    - **常见的23种设计模式**:单例、工厂、建造者、观察者、装饰器等,理解其应用场景。 8. **框架与库** - **Spring框架**:依赖注入(DI)、AOP、事务管理等核心概念。 - **MyBatis**:持久层框架,动态SQL和...

    [转载]QQ示例源码(供学习C++网络编程参考)

    9. **设计模式**:在实现大型网络应用时,设计模式如工厂模式、观察者模式和状态机模式等可以帮助构建可扩展和可维护的代码。 10. **网络库**:为了简化网络编程,有许多优秀的C++库可供使用,如Boost.Asio、Poco库...

    java编程思想习题及答案

    10. **设计模式**:习题可能涉及到一些常见的设计模式,如单例、工厂、观察者、装饰器等,设计模式是解决常见编程问题的通用解决方案。 通过解答这些习题,学习者不仅能巩固Java语言的基础,还能提高解决实际问题的...

    精品(2021-2022年)资料质量管理体系考试题转载.doc

    14. 变异的观察:在整个产品生命周期中,变异现象都可以被观察到。 15. 更换审核组成员:受审核方有权基于合理理由申请更换审核员。 16. 质量管理四大要素:包括质量策划、质量控制、质量保证和质量改进。 17. ...

    抽奖软件java

    8. **设计模式**:良好的软件设计通常会运用设计模式,比如单例模式用于控制抽奖逻辑的实例化,工厂模式用于创建GUI组件,观察者模式用于更新界面状态等。 9. **程序测试**:代码已经测试并确认无误,这意味着...

    小小图片爬虫

    11. **代码结构与设计模式**:良好的代码组织和设计模式(如工厂模式、观察者模式)可以使项目更易于维护和扩展。 通过学习和实践这个【小小图片爬虫】项目,开发者不仅可以掌握HTTP请求的基本操作,还能了解到如何...

    《给 Android 开发者的 RxJava 详解》 PDF

    首先,RxJava 的核心概念是 Observable(可观察者)和 Observer(观察者)。Observable 能够发布数据,而 Observer 则订阅这些数据并进行处理。这种模式遵循了发布/订阅设计模式,使得数据流的处理更加灵活和解耦。 ...

    java事例集合1

    9. **设计模式**:可能包含一些常见设计模式的实现,如单例、工厂、观察者等。 10. **异常与日志记录**:如何有效地捕获和记录程序中的异常信息。 11. **反射机制**:用于在运行时动态获取类的信息和操控对象。 ...

Global site tag (gtag.js) - Google Analytics