观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会得到通知并自动更新。以下是一个简单的示例,说明如何使用观察者模式来实现事件监听。
假设我们要设计一个邮件订阅系统,它允许用户订阅和取消订阅不同类型的邮件,例如新闻、促销和服务等。此时,我们可以使用观察者模式来实现该系统,具体实现如下:
- 定义主题接口:首先,我们需要定义一个
Subject
接口,作为所有主题类的基类,它包含了注册、注销和通知观察者的方法。
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(String message);
}
- 定义观察者接口:然后,我们定义一个
Observer
接口,作为所有观察者类的基类,它包含了接收通知并进行处理的方法。
public interface Observer {
void update(String message);
}
- 实现主题类:最后,我们可以创建具体的主题类,例如
EmailSubject
,它实现了Subject
接口,并负责管理不同类型的邮件订阅者列表,并通知它们有新邮件到达。
import java.util.ArrayList;
import java.util.List;
public class EmailSubject implements Subject {
private List<Observer> observers;
private String message;
public EmailSubject() {
this.observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
if (!observers.contains(observer)) {
observers.add(observer);
}
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String message) {
this.message = message;
for (Observer observer : observers) {
observer.update(message);
}
}
}
- 实现观察者类:同时,我们还需要创建具体的观察者类,例如
EmailSubscriber
,它实现了Observer
接口,并在主题发生变化时接收并处理通知。
public class EmailSubscriber implements Observer {
private final String email;
public EmailSubscriber(String email) {
this.email = email;
}
@Override
public void update(String message) {
System.out.println("Received email '" + message + "' from " + email);
}
}
- 使用观察者模式:现在,我们可以创建邮件订阅系统,例如:
EmailSubject emailSubject = new EmailSubject();
emailSubject.registerObserver(new EmailSubscriber("example@gmail.com"));
emailSubject.notifyObservers("News: Welcome to our newsletter!");
这里我们创建了一个EmailSubject
对象,并向其中注册了一个邮箱订阅者。然后,我们使用notifyObservers()
方法发送一封新邮件,并由订阅者接收并处理该邮件。输出结果为:
Received email 'News: Welcome to our newsletter!' from example@gmail.com
这样就实现了一个简单的观察者模式,使得主题与观察者之间松耦合,易于扩展和维护。如果有更多的订阅者加入或退出,只需要调用相应的注册或注销方法即可;如果有更多的消息类型需要发送,只需要创建新的主题类即可。