软考
APP下载

jdk 观察者模式

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

```

备考资料 免费领取:软件设计师报考指南+考情分析+思维导图等 立即下载
真题演练 精准解析历年真题,助你高效备考! 立即做题
相关阅读
软件设计师题库