在 Java 中,**观察者模式(Observer Pattern)**之所以能实现“解耦”,核心思想是:对象之间只依赖“抽象”,不依赖“具体实现”,且通过事件通知而不是直接调用。
下面从「为什么耦合」「如何解耦」「Java 中的实现方式」三个层面说明。
class OrderService {
public void createOrder() {
EmailService email = new EmailService();
SMSService sms = new SMSService();
email.send();
sms.send();
}
}
问题:
OrderService 直接依赖 EmailService、SMSServiceOrderService定义观察者接口:
interface Observer {
void update(String message);
}
被观察者只依赖 Observer:
class Subject {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer o) {
observers.add(o);
}
public void notifyObservers(String msg) {
for (Observer o : observers) {
o.update(msg);
}
}
}
✅ 被观察者 不知道 观察者是谁、做什么
class EmailObserver implements Observer {
public void update(String msg) {
System.out.println("邮件通知:" + msg);
}
}
class SMSObserver implements Observer {
public void update(String msg) {
System.out.println("短信通知:" + msg);
}
}
使用:
Subject subject = new Subject();
subject.addObserver(new EmailObserver());
subject.addObserver(new SMSObserver());
subject.notifyObservers("订单创建成功");
✅ Subject 不需要修改代码
✅ 新增观察者不影响原有逻辑
java.util.Observable(已过时但经典)class Order extends Observable {
public void create() {
setChanged();
notifyObservers("订单创建");
}
}
class Logger implements Observer {
public void update(Observable o, Object arg) {
System.out.println(arg);
}
}
// 事件
class OrderEvent extends ApplicationEvent {
public OrderEvent(Object source) {
super(source);
}
}
// 发布者
@Service
class OrderService {
@Autowired
ApplicationEventPublisher publisher;
public void create() {
publisher.publishEvent(new OrderEvent(this));
}
}
// 监听者(完全解耦)
@Component
class EmailListener {
@EventListener
public void onOrder(OrderEvent event) {
System.out.println("发送邮件");
}
}
✅ 发布者不依赖监听者
✅ 可异步、可排序、可条件触发
| 维度 | 传统方式 | 观察者模式 |
|---|---|---|
| 依赖关系 | 具体类 | 抽象接口 |
| 调用方式 | 主动调用 | 被动通知 |
| 扩展方式 | 改源码 | 注册新观察者 |
| 测试难度 | 高 | 低 |
Java 观察者模式通过将“行为触发”与“行为响应”分离,用接口和事件通知代替直接方法调用,从而实现对象之间的低耦合、高扩展。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。