观察者模式是一种十分常见的设计模式,它属于行为型模式,用于处理对象间的一对多依赖关系。在这种模式中,一个对象(称为主题)维护着一系列依赖于它的对象(称为观察者),并在满足一定条件时主动通知这些观察者。
在Java中,观察者模式已经被广泛运用了,而且JDK中还提供了一个标准的观察者模式接口类库——Observer和Observable。下面从使用场景、优缺点、具体实现等方面,对JDK自带的观察者模式进行详细解析。
一、使用场景
观察者模式一般适用于以下场景:
1. 一个抽象模型有两个方面,其中一个方面依赖于另一个方面;
2. 当一个对象的改变需要同时改变其他对象,而且不知道有多少对象需要改变时;
3. 当一个对象必须通知其他对象,而其他对象又不能确定是谁。
举个例子:传统MVC模式中,View是面向用户的视图,它们通常对Controller进行响应,而Controller则依赖Model来获取状态和数据,最后对View进行调用。在这个过程中,View是观察者,Model是主题。
二、优缺点
观察者模式有以下优点:
1. 观察者和被观察者之间建立了一个抽象耦合;
2. 观察者模式支持广播通信;
3. 观察者模式符合“开闭原则”,可以在不修改代码的情况下增加新的观察者和主题;
4. 观察者模式增加了程序的可重用性。
观察者模式也有一些缺点:
1. 如果一个观察者对象需要了解所有主题的通知,这个对象可能需要存储所有主题对象的引用;
2. 观察者模式没有处理执行顺序的机制,导致不同的观察者接收到通知的顺序可能是不同的。
三、具体实现
在JDK中,观察者模式主要涉及以下两个类:Observer和Observable。其中,Observer是接口,用于表示观察者,而Observable则是一个类,用于表示主题。
具体步骤如下:
1. 定义一个Observable类,然后在需要通知观察者的时候,就调用Observable类的setChanged()和notifyObservers()方法即可。
```java
public class MyObservable extends java.util.Observable {
private String name;
public MyObservable(String name) {
this.name = name;
}
public void updateName(String name) {
this.name = name;
setChanged();
notifyObservers(name);
}
}
```
2. 定义一个Observer接口,然后让实现它的所有类实现update()方法,这个方法用于在主题状态改变的时候更新状态。
```java
public class MyObserver implements java.util.Observer {
@Override
public void update(java.util.Observable o, Object arg) {
String name = (String) arg;
System.out.println("Observe name changed to " + name);
}
}
```
3. 在需要的地方,使用addObserver()方法将观察者添加到主题列表中。
```java
MyObservable observable = new MyObservable("Tom");
MyObserver observer = new MyObserver();
observable.addObserver(observer);
```
4. 当需要通知观察者时,直接调用updateName()方法即可。
```java
observable.updateName("Jerry");
```
扫码咨询 领取资料