JDK观察者模式
观察者模式是一种设计模式,其特点是一个对象(称为主题)维护其依赖项(称为观察者)的列表,并在状态发生变化时自动通知它们。 JDK(Java Development Kit)中提供了一个完整的观察者模式应用程序编程接口(API),可用于在Java应用程序中实现此模式。
用途
观察者模式非常有用,可以用于各种场景,如:
1.事件管理:当应用程序中的某个事件发生时,观察者模式可以通知侦听事件的观察者对象。
2.用户界面:当用户界面中的某个控件发生变化时,观察者模式可以通知其他控件或UI组件进行更新。
3.数据管理:在数据管理中,观察者模式可以用来自动更新数据呈现和视图,而无需开发人员手动干预。
JDK实现
在JDK中,Java.util包中的Observable类和Observer接口是观察者模式的关键组件。这两个类提供了一个标准的方式来实现观察者模式,并且除了不允许多个Observable子类之外,它们是通用的和灵活的。
Observable类
Observable类是Java中用于实现主题的类。Observable类提供了以下方法:
1.addObserver(Observer o):将一个观察者添加到此主题的观察者列表中。
2.deleteObserver(Observer o):从此主题的观察者列表中删除一个观察者。
3.notifyObservers(Object arg):通知此主题的所有观察者状态已更改,并将提供的参数传递给每个观察者。
Observer接口
Observer接口定义了在Java中实现观察者模式的标准API。Observer接口只有一个方法:
1.update(Observable o,Object arg):这是由Observable类调用的方法。当主题状态发生更改时,将调用此方法来通知观察者。
实例分析
以下是一个使用JDK实现观察者模式的示例。在此示例中,我们从Observable类派生一个名为MyObservable的子类,并将其用作主题来通知每个观察者。我们还创建了Observer接口的两个实现:EmailWatcher和SMSWatcher。
MyObservable类:
```
import java.util.Observable;
public class MyObservable extends Observable {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String msg) {
this.message = msg;
setChanged();
notifyObservers();
}
}
```
EmailWatcher类:
```
import java.util.Observable;
import java.util.Observer;
public class EmailWatcher implements Observer {
public void update(Observable obs, Object arg) {
System.out.println("Email sends " + ((MyObservable)obs).getMessage());
}
}
```
SMSWatcher类:
```
import java.util.Observable;
import java.util.Observer;
public class SMSWatcher implements Observer {
public void update(Observable obs, Object arg) {
System.out.println("SMS sends " + ((MyObservable)obs).getMessage());
}
}
```
测试代码:
```
public class Demo {
public static void main(String[] args) {
MyObservable subject = new MyObservable();
EmailWatcher emailW = new EmailWatcher();
SMSWatcher smsW = new SMSWatcher();
subject.addObserver(emailW);
subject.addObserver(smsW);
System.out.println("Change message to Hello World");
subject.setMessage("Hello World");
}
}
```
通过运行上面的代码,会收到以下输出:
```
Change message to Hello World
Email sends Hello World
SMS sends Hello World
```
扫码咨询 领取资料