`
WilliamLiu
  • 浏览: 27092 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

设计模式之观察者(Observer)模式

阅读更多

        Observer模式中文名称叫观察者模式,在Java中,可以通过JDK提供的java.util.Observable类和 java.util.Observer接口实现Observer模式。Observer模式定义对象间的一对一或一对多的依赖关系,当一个对象(Observable)的状态发生改变时, 所有依赖于它的对象(Observer)都得到通知并被自动更新。

   

下面,我们分别来看下Observable类和Observer接口的方法和作用。

1、 Observable  类代表 被观察者 (java.util.Observable )

        主要方法有:

        void setChanged() : 设置被观察者的状态已经被改变
        void addObserver(Observer  observer) : 添加观察者
        int countObservers() : 返回所有观察者的数目
        void deleteObserver(Observer  observer) :删除指定观察者
        void deleteObservers() : 删除所有观察者
        boolean hasChanged() : 被观察者的状态是否被改变,如果是则返回true,否则返回false
        void notifyObservers()  : 通知所有观察者(没有参数)

        void notifyObservers(Object arg) : 通知所有观察者(带参数,参数一般设定为被改变的属性)
        void clearChanged() :清除被观察者状态的改变(即调用 hasChanged() 时会返回 false)

2、Observer 接口代表 观察者 (java.util.Observer )

        void update(Observable observable, Object arg) :当 被观察者 调用 notifyObservers(*) 方法

时,会根据被观察者的 hasChanged() 方法 来判断 它的状态是否被改变, 如果被观察者的状态被改变了,则

会调用 观察者 的 update 方法,参数 observable 为 被观察者对象, arg 为调用 notifyObservers( Object arg ) 时传入的参数 arg ,如果调用的是 notifyObservers() 方法, 则 arg 为 null( 注意 :应该把这个参数 arg 设定为 被观察者的 被改变的属性)。

 

以下是一个Observer模式的例子:

1、被观察者Car类,继承至Observable类

package com.huawei.observer.observable;

import java.util.Observable;

public class Car extends Observable implements Runnable{

	private Float gasoline;//汽车的汽油量

	public Car(Float gasoline) {
		super();
		this.gasoline = gasoline;
	}

	public Float getGasoline() {
		return gasoline;
	}

	public void setGasoline(Float gasoline) {
		this.gasoline = gasoline;
	}
	
	/**
	 * 模拟汽车行驶过程中的耗油的方法
	 */
	public synchronized void consume(){
		if(--gasoline < 5){//若油箱中的油少于5升则让汽车提示驾驶员加油。
			this.setChanged();
			this.notifyObservers(gasoline);//通知驾驶员加油。
		}
	}

	/**
	 * 模拟汽车的行驶过程
	 */
	@Override
	public void run() {
		while(Boolean.TRUE){
			consume();
			if(gasoline == 0){//当油箱中还剩0升油时汽车停止
				break;
			}
			try {
				Thread.sleep(1000);//每一秒钟耗油1升
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}

 

2、观察者Driver类,实现Observer接口

package com.huawei.observer.observer;

import java.util.Observable;
import java.util.Observer;

import com.huawei.observer.observable.Car;

public class Driver implements Observer {

	private String name;//驾驶员名字
	
	public Driver(String name) {
		super();
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}


	@Override
	public void update(Observable observable, Object object) {
		Car car = null;//当前行驶的汽车。
		Float gasoline = null;//当前行驶的汽车的油量。
		
		if(observable instanceof Car){
			car = (Car)observable;
		}else{
			return ;
		}
		
		if(object instanceof Float){
			gasoline = (Float)object;
		}else{
			return ;
		}
		if(gasoline != 0){
			System.out.println("驾驶员"+name+"您好,您的油箱汽油还剩  " + gasoline + " 升,请尽快加油!" );
		}else{
			System.out.println("驾驶员"+name+"您好,您的油箱已无汽油,汽车已停止!" );
		}
	}

}

 

3、测试类Test

package com.huawei.observer.main;

import com.huawei.observer.observable.Car;
import com.huawei.observer.observer.Driver;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Car car = new Car(35F);//实例化被观察者,即汽车,初始状态油箱35升油。
		Driver driver = new Driver("William");//实例化观察者,即汽车驾驶员,名字是William。
		
		car.addObserver(driver);//为被观察者(汽车)添加观察者(驾驶员)
		
		new Thread(car).start();//启动汽车行驶的线程,每一秒钟耗油1升。
	}

}

 

 

4、运行测试类,(汽车行驶30秒钟后)输出结果如下:

驾驶员William您好,您的油箱汽油还剩  4.0 升,请尽快加油!
驾驶员William您好,您的油箱汽油还剩  3.0 升,请尽快加油!
驾驶员William您好,您的油箱汽油还剩  2.0 升,请尽快加油!
驾驶员William您好,您的油箱汽油还剩  1.0 升,请尽快加油!
驾驶员William您好,您的油箱已无汽油,汽车已停止!

分享到:
评论

相关推荐

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

    观察者模式(Observer)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在C++中广泛应用,特别是在需要...

    设计模式之观察者模式(Observer Pattern)

    观察者模式,也被称为发布-订阅模式或事件驱动模式,是软件设计模式中的一种行为模式。这个模式的主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    设计模式之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...

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

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...

    设计模式之略见一斑(Observer观察者模式)

    本篇文章将深入探讨“Observer”观察者模式,这是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心概念是主题...

    C++设计模式之观察者模式(Observer)

    观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...

    java23种设计模式之观察者模式

    **观察者模式(Observer Pattern)**是软件设计模式中的一种行为模式,它在Java中有着广泛的应用。这个模式的核心思想是“一对多”的依赖关系,即一个主题对象(Subject)可以被多个观察者(Observer)关注,当主题...

    设计模式之观察者模式

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

    设计模式-观察者模式-作业-observer.zip

    观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...

    设计模式之观察者模式Java实现

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    **C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...

    Java 设计模式-观察者模式(Observer)

    结合微信公众号讲解观察者模式,生动形象,关键是上手快啊

    设计模式实现——观察者模式

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

    Unity3D设计模式之观察者模式

    观察者模式(Observer Pattern)是一种软件设计模式,属于行为型模式之一。它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式可以有效地实现...

    Observer设计模式实例

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

    设计模式之Observer - 观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...

    Observer 观察者模式 示例 源码 ----设计模式

    观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...

Global site tag (gtag.js) - Google Analytics