Observer 模式 | 第 2 页(共3 页) |
Observer 是一个很常见的模式。在您用“模型/视图/控制器(Model/View/Controller)”体系结构实现应用程序时,通常会使用这一模式。该设计的“模型/视图”部分是为了去除数据的表示与数据本身的耦合性。
例如,设想这种情况:数据保存在数据库中,可以以多种格式(表格或图形)显示该数据。Observer 模式建议显示类向负责维护数据的类注册它们自身,这样在数据发生更改时可以通知显示类,从而它们可以更新它们的显示。
Java API 在它的 AWT/Swing 类的事件模型中使用该模式。它也提供了直接支持,这样出于其它目的时也能实现该模式。
Java API 提供了 Observable
类,它可以由要观察的对象进行子类化。Observable
提供了以下方法:
Observable
对象调用addObserver(Observer o)
来注册自己。
setChanged()
将Observable
对象标记为已更改。
hasChanged()
测试Observable
对象是否已更改。
- 根据
hasChanged()
,如果Observable
对象已更改,notifyObservers()
通知所有观察类。
与此相应,还提供了一个 Observer
接口,它包含一个由 Observable
对象在其发生更改时调用的方法(当然,是在 Observer
已向 Observable
类注册了它自己的前提下):
public void update(Observable o, Object arg)
下面示例演示了如何使用 Observer 模式来通知诸如温度等传感器的显示类已检测到变化:
import java.util.*;
class Sensor extends Observable {
private int temp = 68;
void takeReading()
{
double d;
d =Math.random();
if(d>0.75)
{
temp++;
setChanged();
}
else if (d<0.25)
{
temp--;
setChanged();
}
System.out.print("[Temp: " + temp + "]");
}
public int getReading()
{
return temp;
}
}
public class Display implements Observer {
public void update(Observable o, Object arg)
{
System.out.print("New Temp: " + ((Sensor) o).getReading());
}
public static void main(String []ac)
{
Sensor sensor = new Sensor();
Display display = new Display();
// register observer with observable class
sensor.addObserver(display);
// Simulate measuring temp over time
for(int i=0; i < 20; i++)
{
sensor.takeReading();
sensor.notifyObservers();
System.out.println();
}
}
}