观察者模式是一种设计模式,它的目的是在对象之间建立一对多的关系,其中一个对象(称为主题或可观察对象)发生改变时,其所有依赖者(称为观察者)都会自动收到通知并进行更新。这种模式可以帮助我们更好地将复杂的系统分解为更小的部分,并且提供了更好的松耦合性和可重用性。
在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
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接口即可,而不需要更改主题的代码。同样,当我们需要更改主题的业务逻辑时,只需要更改对应的代码即可,而不会影响到观察者的代码。
扫码咨询 领取资料