设计模式深度解析:观察者模式(Observer Pattern)及其应用实践
什么是观察者模式?
观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象(主题)的状态发生改变时,所有依赖它的对象(观察者)都会自动收到通知并更新。这种模式常用于实现事件处理系统。
核心角色
- Subject(主题):维护一个观察者列表,提供添加、删除和通知观察者的方法。
- Observer(观察者):定义一个更新接口,用于接收主题的通知。
- ConcreteSubject(具体主题):实现主题接口,存储具体状态,并在状态改变时通知观察者。
- ConcreteObserver(具体观察者):实现观察者接口,定义具体的更新逻辑。
代码示例
Java 实现
import java.util.ArrayList;
import java.util.List;
// 观察者接口
interface Observer {
void update(String message);
}
// 主题接口
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 具体主题:新闻发布系统
class NewsPublisher implements Subject {
private List<Observer> observers = new ArrayList<>();
private String latestNews;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(latestNews);
}
}
public void setLatestNews(String news) {
this.latestNews = news;
notifyObservers();
}
}
// 具体观察者:新闻订阅者
class NewsSubscriber implements Observer {
private String name;
public NewsSubscriber(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 收到最新新闻:" + message);
}
}
// 测试代码
public class ObserverPatternDemo {
public static void main(String[] args) {
NewsPublisher publisher = new NewsPublisher();
Observer subscriber1 = new NewsSubscriber("用户A");
Observer subscriber2 = new NewsSubscriber("用户B");
publisher.registerObserver(subscriber1);
publisher.registerObserver(subscriber2);
publisher.setLatestNews("Java 17 正式发布!");
}
}
应用场景:电商价格变动通知
假设有一个电商平台,用户可以订阅某个商品的价格变动通知。当商品价格发生变化时,所有订阅该商品的用户都会收到通知。
实现思路
- 主题:商品类,维护订阅该商品的用户列表。
- 观察者:用户类,实现价格变动的通知逻辑。
- 触发通知:商品价格变动时,调用通知方法。
总结
观察者模式通过解耦主题和观察者,实现了灵活的事件通知机制。它适用于需要动态管理依赖关系的场景,如GUI事件处理、消息队列等。