观察者模式,又叫做发布-订阅模式。它是一个常用的设计模式,用于对象间的一对多通知机制。一旦一个对象的状态发生改变,所以依赖于它的对象都会被通知到并更新对应的状态。观察者模式的实现方式有很多种,本文将从不同角度介绍几种常见的实现方式。
一、基于Java内置的Observable和Observer接口
Java内置了Observable类和Observer接口,我们可以通过继承Observable类和实现Observer接口来实现观察者模式。具体实现如下:
```java
import java.util.Observable;
import java.util.Observer;
// 具体的观察者
class ConcreteObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("观察到对象发生了变化");
}
}
// 具体的被观察者
class ConcreteObservable extends Observable {
public void notifyObservers(Object arg) {
setChanged();
super.notifyObservers(arg);
}
}
// 测试代码
public class Test {
public static void main(String[] args) {
ConcreteObservable observable = new ConcreteObservable();
ConcreteObserver observer = new ConcreteObserver();
observable.addObserver(observer);
observable.notifyObservers();
}
}
```
二、基于回调函数
回调函数是一种函数指针,用于在事件发生时调用函数。基于回调函数的观察者模式实现方式非常常见。具体实现如下:
```java
// 定义回调函数接口
interface OnUpdateListener {
void onUpdate();
}
// 具体的观察者
class ConcreteObserver implements OnUpdateListener {
@Override
public void onUpdate() {
System.out.println("观察到对象发生了变化");
}
}
// 具体的被观察者
class ConcreteObservable {
private OnUpdateListener onUpdateListener;
public void setOnUpdateListener(OnUpdateListener onUpdateListener) {
this.onUpdateListener = onUpdateListener;
}
public void notifyObservers() {
if (onUpdateListener != null) {
onUpdateListener.onUpdate();
}
}
}
// 测试代码
public class Test {
public static void main(String[] args) {
ConcreteObservable observable = new ConcreteObservable();
ConcreteObserver observer = new ConcreteObserver();
observable.setOnUpdateListener(observer);
observable.notifyObservers();
}
}
```
三、基于事件机制
事件机制是另一种常见的实现观察者模式的方式。在基于事件机制的观察者模式中,被观察者会发布事件,而观察者会注册事件并且响应事件。具体实现如下:
```java
// 定义事件类
class Event {
private String message;
public Event(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
// 定义观察者接口
interface Observer {
void onUpdate(Event event);
}
// 具体的观察者
class ConcreteObserver implements Observer {
@Override
public void onUpdate(Event event) {
System.out.println("观察到对象发生了变化,事件内容为:" + event.getMessage());
}
}
// 具体的被观察者
class ConcreteObservable {
private List
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(Event event) {
for (Observer observer : observers) {
observer.onUpdate(event);
}
}
}
// 测试代码
public class Test {
public static void main(String[] args) {
ConcreteObservable observable = new ConcreteObservable();
ConcreteObserver observer = new ConcreteObserver();
observable.addObserver(observer);
observable.notifyObservers(new Event("对象发生了变化"));
}
}
```
除了上述三种实现方式,还有其他的一些实现方式,比如基于.NET平台的事件模型,基于Qt框架的信号与槽机制,基于Spring框架的应用事件等。
本文从Java内置的Observable和Observer接口、基于回调函数以及基于事件机制等三个方面介绍了观察者模式的实现方式。通过这些实现方式,我们可以更加灵活地使用观察者模式,并且可以根据具体的业务场景选择适合的实现方式。观察者模式广泛应用于GUI编程、订阅发布系统、消息队列等场景中。
扫码咨询 领取资料