设计模式:观察者模式详解与 Java 实现
一、概述
在软件系统中,对象之间往往存在一对多的依赖关系。当其中一个对象(主题)的状态发生改变时,所有依赖于它的对象(观察者)都需要得到通知并自动更新。这种设计模式被称为观察者模式(Observer Pattern),也称为发布 - 订阅模式(Publish-Subscribe Pattern)。
该模式属于行为型模式,旨在定义对象间的一种一对多的依赖关系,使得当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。在实际业务场景中,如事件驱动架构、GUI 界面响应、消息队列等,观察者模式都有着广泛的应用。
二、核心组成部分
观察者模式主要包含以下四个角色:
-
抽象主题(Subject): 又称被观察者,是具体主题的父类或接口。它负责存储所有观察者的引用,并提供注册、删除和通知观察者的方法。
-
抽象观察者(Observer): 为所有具体的观察者定义一个更新接口。当主题发生变化时,调用此接口通知观察者。
-
具体主题(Concrete Subject): 实现抽象主题接口,存储与具体业务相关的状态信息。当状态改变时,发送通知。
-
具体观察者(Concrete Observer): 实现抽象观察者接口,维护一个指向具体主题的引用,以便在接收到通知时更新自身状态。
三、代码实现示例
为了更直观地理解,我们构建一个水果店价格变动通知系统。当某种水果(如车厘子)的价格发生变化时,所有订阅了该信息的门店都会收到通知并刷新价格显示。
1. 定义抽象主题(Subject)
抽象主题需要维护一个观察者列表,并提供添加、移除和通知的方法。为了保证线程安全,这里使用 CopyOnWriteArrayList。
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
/**
* 抽象主题类
*/
public abstract class Subject {
private static final Logger logger = Logger.getLogger(Subject.class.getName());
/** 保存订阅者对象集合 */
protected final List<Observer> observerList = new CopyOnWriteArrayList<>();
/**
* 新增订阅者
*/
public boolean attach(Observer observer) {
if (observer != && !observerList.contains(observer)) {
observerList.add(observer);
logger.info(observer.toString() + );
;
}
;
}
{
(observer != ) {
observerList.remove(observer);
(removed) {
logger.info(observer.toString() + );
}
removed;
}
;
}
{
(Observer observer : observerList) {
{
observer.update();
} (Exception e) {
logger.warning( + e.getMessage());
}
}
}
}


