`
hanmiao
  • 浏览: 56925 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Java 语言使用 Observer/Observable 实现简单的观察者模式

 
阅读更多

观察者模式的简单概念

假设现在有A、B、C、D等四个独立的对象,其中B、C、D这三个对象想在A对象发生改变的第壹时间知道这种改变,以便做出相应的响应。
上面的这种情形,就是观察者模式。当然每個被观察者可以有多个观察者,每個观察者也可以有多个被观察者。观察者与被观察者也不是对立的,壹個对象可以观察其他对象,也可以被其他对象观察。

观察者模式的应用场景

为了更好的理解什么是观察者模式,下面列举壹些可能用到该模式的情形或例子:
(1)周期性任务。比如linux中的周期性任务命令crontab命令,win7 下的定时关机命令shutdown -s -t 1200(1200s后关机)。当预期系统时间到后,这些命令就可以通知相应的观察者激活相应的命令并执行对应操作。
(2)重新加载配置文件。现在做大型系统基本都会有配置文件,例如在SSH项目中每次修改配置文件后,都需要重新启动服务器才能使得新的配置文件生效,当然SSH中貌似已经提供了参数设置,当配置文件修改时,可以自动重新加载。

观察者模式相关的 Java 类

java.util.Observable //继承该类的子类是可以被观察的,在观察者模式中充当被观察者

API 中的相关说明如下:This class represents an observable object, or "data" in the model-view paradigm. It can be subclassed to represent an object that the application wants to have observed.

An observable object can have one or more observers. An observer may be any object that implements interface Observer. After an observable instance changes, an application calling the Observable's notifyObservers method causes all of its observers to be notified of the change by a call to their update method.

The order in which notifications will be delivered is unspecified. The default implementation provided in the Observable class will notify Observers in the order in which they registered interest, but subclasses may change this order, use no guaranteed order, deliver notifications on separate threads, or may guarantee that their subclass follows this order, as they choose.

Note that this notification mechanism is has nothing to do with threads and is completely separate from the wait and notify mechanism of class Object.

When an observable object is newly created, its set of observers is empty. Two observers are considered the same if and only if the equals method returns true for them.

如何实现简单的观察者模式

接下来我们实现壹個简单的被观察者类 ExampleObservable ,代码如下:

import java.util.Observable;

public class ExampleObservable extends Observable {
	int data = 0;
	
	public void setData(int data){
		this.data = data;
		this.setChanged();//标记此 Observable对象为已改变的对象
this.notifyObservers();//通知所有的观察者
	}
}

再实现壹個观察者类 ExampleObserver,代码如下:
import java.util.Observable;
import java.util.Observer;

public class ExampleObserver implements Observer {
 //有被观察者发生变化,自动调用对应观察者的update方法
 @Override
	public void update(Observable object, Object argument) {
 //通过强制类型转换获取被观察者对象
ExampleObservable example = (ExampleObservable)object;
		System.out.println("example.data changed, the new value of data is " + example.data);
	}
}

我们再写壹個简单的测试类来测试下它是否运行正确,代码如下:
public class Main {

	public static void main(String[] args) {
		ExampleObservable example = new ExampleObservable();
		example.addObserver(new ExampleObserver());//给example这个被观察者添加观察者,允许添加多個观察者
		example.setData(2);
		example.setData(-5);
		example.setData(9999);
	}
}
运行之后在控制台输出如下结果:
example.data changed, the new value of data is 2
example.data changed, the new value of data is -5
example.data changed, the new value of data is 9999
通过输出结果我们可以了解到,当 ExampleObservable 类的实例 example 的成员变量 data 的值发生改变时,ExampleObserver 对象都能够监测到,然后调用 update() 方法打印壹句话到控制台,说明以上的结果是符合我们预期的。

既是观察者又是被观察者

对于壹個类而言,可以既是观察者又是被观察者,只要既继承 Observable 类,又实现 Observer 接口就可以了。接下来给出壹個类似的例子。例子中 ObserverA 和 ObserverB 既是观察者又是被观察者,它们互相监听着对方的改变。
//ObserverA.java
import java.util.Observable;
import java.util.Observer;

public class ObserverA extends Observable implements Observer {

	@Override
	public void update(Observable object, Object arg) {
		ObserverB observerB = (ObserverB)object;
		System.out.println("observerB changed, the new value of observerB.data is " + observerB.data);
		this.setChanged();
		this.notifyObservers();
	}
}

//ObserverB.java
import java.util.Observable;
import java.util.Observer;

public class ObserverB extends Observable implements Observer {

	int data = 0;
	@Override
	public void update(Observable object, Object arg) {
		System.out.println("ObserverB found that ObserverA changed...");
	}
	
	public void setData(int data){
		this.data = data;
		this.setChanged();
		this.notifyObservers();
	}
}

//Main.java
import net.oschina.bairrfhoinn.multiply.ObserverA;
import net.oschina.bairrfhoinn.multiply.ObserverB;

public class Main {

	public static void main(String[] args) {
		ObserverA a = new ObserverA();
		ObserverB b = new ObserverB();
		
		a.addObserver(b);
		b.addObserver(a);
		
		b.setData(2);
	}
}
运行之后的结果为:
observerB changed, the new value of observerB.data is 2
ObserverB found that ObserverA changed...
之所以会出现上述运行结果,最初 ObserverA 和 ObserverB 相互之间作为观察者与被观察者,但是 ObserverB 的实例 b 先调用的 setData() 方法,然后 ObserverA 的实例 a 观察到了这個变化,于是调用了本类的 update 方法打印出了第壹行,紧接着 ObserverA 的 update() 方法在方法体中声明了自己发生了变化,于是 ObserverB 观察了这個情况,也调用了自身的 update() 方法并打印了第二句话。


分享到:
评论

相关推荐

    Java内置观察者模式

    观察者模式(Observer Pattern)是设计模式中的一种行为...Java内置的观察者模式提供了一种简单而有效的机制,使得对象间的交互更加灵活。通过理解并熟练运用这一模式,开发者可以构建出更具响应性和扩展性的软件系统。

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

    4. **Java实现**:在Java中,`java.util.Observable`类和`java.util.Observer`接口提供了观察者模式的标准实现。`Observable`类代表主题,`Observer`接口代表观察者。通过`addObserver()`添加观察者,`...

    java观察者模式Demo

    标题中的“java观察者模式Demo”指的是使用Java语言来演示观察者模式的应用。通常,这个Demo会包含一个可观察的对象(Observable)和多个观察者(Observer),当可观察对象的状态发生变化时,会触发通知机制,使得...

    java 观察者模式 demo

    在Java中,观察者模式的实现主要依赖于Java的`java.util.Observable`类和`java.util.Observer`接口。`Observable`类代表被观察的对象,它可以有多个观察者;`Observer`接口则代表观察者,它们需要实现`update`方法来...

    设计模式-观察者模式(讲解及其实现代码)

    在Java中,`java.util.Observable`和`java.util.Observer`类提供了观察者模式的内置支持。而在其他语言中,如C#、Python等,也可以轻松实现观察者模式,通过事件或委托机制。 总结来说,观察者模式是一种重要的设计...

    OBserver模式设计实现

    在描述中提到的"Head First模式设计用的是Java",可能是指书中通过Java语言讲解了观察者模式的基本概念和实现方式,而"实现观察者模式使用C++"则意味着我们将讨论如何在C++环境中实现同样的设计模式。 观察者模式的...

    观察者模式(Observer)

    观察者模式可以通过多种编程语言实现,例如在Java中,可以使用`java.util.Observable`和`java.util.Observer`接口。被观察者实现`Observable`接口,而观察者实现`Observer`接口。当被观察者状态改变时,调用`...

    Observer(观察者模式)学习源码

    在实际项目中,观察者模式可以用于各种场景,如监听用户输入、跟踪文件系统更改、处理后台任务进度更新等。通过深入理解和熟练运用Observer模式,开发者能够构建出更加灵活、响应式和易于维护的软件系统。

    观察者模式(Observer)

    在Java中,`java.util.Observable`类和`java.util.Observer`接口提供了观察者模式的标准实现。例如,你可以创建一个`Observable`对象,然后让其他对象(观察者)调用`addObserver()`方法订阅状态变化。当状态变化时...

    Observer模式

    源码分析方面,我们可以深入研究java.util.Observable和java.util.Observer的实现,了解如何通过这两个类实现观察者模式。同时,还可以探索其他编程语言中对观察者模式的支持,如C#的System.ComponentModel....

    观察者(Observer)模式

    在Java编程语言中,这种模式被内置在`java.util.Observable`和`java.util.Observer`类中。通过实现`Observer`接口,一个类可以成为观察者,而通过继承`Observable`类,一个类可以成为被观察的对象。 观察者模式的...

    掌握Java中的观察者模式:实现动态交互的秘籍

    在Java中,观察者模式可以通过实现`java.util.Observer`接口和`java.util.Observable`类来实现。下面通过具体的代码示例来展示如何实现观察者模式。 ##### 1. 定义观察者接口 观察者需要实现`java.util.Observer`...

    最简单观察者模式,同步数据、图表、值

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象事件发生时通知多个“观察”该对象的其他对象。在Java、C#等面向对象编程语言中,这种模式广泛应用于数据绑定和事件处理,...

    观察者(Observer)模式详解

    例如,在Java中,`java.util.Observable`和`java.util.Observer`类就提供了观察者模式的实现。此外,许多现代编程语言和框架,如JavaScript的事件监听、C#的委托和事件、Android的BroadcastReceiver,都采用了观察者...

    观察者模式学习

    在Java中,观察者模式的标准实现是通过java.util.Observable和java.util.Observer接口。主题类需要实现Observable接口,并维护一个观察者列表。观察者类则实现Observer接口,提供update()方法以接收更新通知。当主题...

    观察者模式示例代码2022

    在Java、C#等面向对象语言中,观察者模式通常通过事件机制来实现。 观察者模式的核心概念包括两个主要角色: 1. **被观察者(Observable)**:这是拥有状态变化的对象,也称为主题。当其状态发生变化时,它会通知...

    观察者模式示例源代码

    Java、C#等面向对象语言都内置了对观察者模式的支持,例如Java的`java.util.Observable`和`java.util.Observer`,C#的`System.ComponentModel.INotifyPropertyChanged`等。 总结来说,观察者模式是一种强大的设计...

    观察者模式(包含简单代码)

    观察者模式是一种行为设计模式,它允许我们定义订阅机制,当对象的状态发生改变时,所有依赖于该状态的...此外,Java和.NET等现代编程语言提供了内置的事件和委托机制,简化了观察者模式的实现,但基本思想仍然相同。

    观察者模式代码

    在Java中,观察者模式被内建在语言特性中,通过`java.util.Observable`和`java.util.Observer`接口来实现。 首先,我们要理解观察者模式的基本概念。在观察者模式中,有一个被观察的对象,也称为主题(Subject),...

Global site tag (gtag.js) - Google Analytics