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

java实现观察者模式

希赛网 2024-06-07 10:47:35

观察者模式是一种设计模式,它的目的是在对象之间建立一对多的关系,其中一个对象(称为主题或可观察对象)发生改变时,其所有依赖者(称为观察者)都会自动收到通知并进行更新。这种模式可以帮助我们更好地将复杂的系统分解为更小的部分,并且提供了更好的松耦合性和可重用性。

在Java中,观察者模式通常有两种实现方式:基于Java自带的Observable和Observer接口,以及自己定义主题和观察者接口。接下来,我们将分别从这两个角度来分析如何实现观察者模式。

基于Java自带的Observable和Observer接口

在基于Java自带的Observable和Observer接口实现观察者模式时,我们需要定义一个被观察的类,这个类需要继承Observable类,并且需要在类中定义一些业务逻辑,当这些逻辑发生改变时,我们需要调用setChanged方法来标记状态变化,并且调用notifyObservers方法通知所有观察者。以下是实现代码:

```java

import java.util.Observable;

public class MyObservable extends Observable {

private String message;

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

setChanged();

notifyObservers();

}

}

```

在观察者中,我们需要实现Observer接口,并且在更新方法中更新我们自己的业务逻辑。以下是实现代码:

```java

import java.util.Observable;

import java.util.Observer;

public class MyObserver implements Observer {

@Override

public void update(Observable o, Object arg) {

System.out.println("Received message: " + ((MyObservable) o).getMessage());

}

}

```

通过这种方式,我们就能实现简单的观察者模式。当MyObservable对象的setMessage方法被调用时,所有的观察者(MyObserver)就会接收到通知。

自己定义主题和观察者接口

在自己定义主题和观察者接口实现观察者模式时,我们需要分别定义一个主题接口和一个观察者接口,这样就可以使主题和观察者之间的耦合更小。以下是实现代码:

```java

public interface Subject {

void registerObserver(Observer observer);

void removeObserver(Observer observer);

void notifyObservers();

}

public interface Observer {

void update(String message);

}

public class MySubject implements Subject {

private List observers = new ArrayList<>();

private String message;

@Override

public void registerObserver(Observer observer) {

observers.add(observer);

}

@Override

public void removeObserver(Observer observer) {

int index = observers.indexOf(observer);

if (index >= 0) {

observers.remove(index);

}

}

@Override

public void notifyObservers() {

for (Observer observer : observers) {

observer.update(message);

}

}

public void setMessage(String message) {

this.message = message;

notifyObservers();

}

}

public class MyObserver implements Observer {

@Override

public void update(String message) {

System.out.println("Received message: " + message);

}

}

```

在这种情况下,主题(MySubject)和观察者(MyObserver)是完全解耦的,他们只需要实现各自的接口即可。当MySubject对象的setMessage方法被调用时,所有的观察者就会接收到通知。

总结

通过以上两种方式,我们可以实现观察者模式,并且使程序更加灵活和可维护。当我们需要增加新的观察者时,只需要实现Observer接口即可,而不需要更改主题的代码。同样,当我们需要更改主题的业务逻辑时,只需要更改对应的代码即可,而不会影响到观察者的代码。

扫码咨询 领取资料


软考.png


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

软考资格查询系统

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