Java系列之观察者模式的实现(一)

在 Java 中,观察者模式是一个很重要的设计模式,在这篇文章中,我们来简单了解一下如何利用 Java 语言的特性来实现
一个简单的观察者模式。

Java 中的 Obserable 与 Observer

在 Java SE 中,有一个 Observer 接口和一个 Observer 类。在 api 文档中,描述如下:

  • Observer 一个类实现乐这个接口之后,被观察的对象如果有改变,那么这个类就可以接收到通知。实现这个接口必须要实现 update 方法。
  • Obserable 这个类代表一个可观察的对象,或者 model 层的一个实例,可以被认为是想被观察的对象的一个子类。一个可观察的对象可以有多个观察者。

实现简单的观察者模式

首先需要定义一个可观察的对象,这个对象中有一个 data 变量,这个变量在被改变的时候会通知到观察者:

1
2
3
4
5
6
7
8
9
10
public class ObservableObject extends Observable{
int data = 0;
public void changeData(int change) {
data = change;
this.setChanged(); //标记对象被改变
this.notifyObservers(); //通知所有的观察者
}
}

定义观察者,观察者在接收到被观察者的改变之后,会将改变的值打印出来:

1
2
3
4
5
6
7
8
9
10
public class ObserverObject implements Observer {
@Override
public void update(Observable o, Object arg) {
ObservableObject oo = (ObservableObject) o;
System.out.println("被观察者的数据被修改为:"+ oo.data);
}
}

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {
public static void main(String[] args) {
ObservableObject observableObject = new ObservableObject();
ObserverObject observerObject = new ObserverObject();
observableObject.addObserver(observerObject);
observableObject.changeData(1);
observableObject.changeData(-100);
observableObject.deleteObserver(observerObject); //移除观察者
observableObject.changeData(200);
}
}

运行结果为:

1
2
被观察者的数据被修改为:1
被观察者的数据被修改为:-100

需要注意的是只打印了两个结果,是因为在第三次改变之前将观察者移除了,这样造成的结果是被观察者的改变将不能通知到被移除的观察者。