希赛考试网
首页 > 软考 > 软件设计师

jdk 观察者模式

希赛网 2024-06-06 16:14:36

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

```

扫码咨询 领取资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件