定义
观察者模式(Observer Pattern)是一种行为型设计模式,定义对象间一对多的依赖关系。当核心对象(被观察者)状态发生变化时,所有依赖它的对象(观察者)会自动收到通知并更新自身状态。
其核心特点包括:
1)松耦合:被观察者无需知晓观察者的具体实现细节,仅通过抽象接口交互。
2)自动通知:状态变化触发自动广播,减少手动调用。
3)别名:又称发布-订阅模式(Publisher-Subscriber),强调消息的分发机制。
结构
适用场景
观察者模式适用于以下典型场景:
1)事件驱动系统
示例:GUI按钮点击事件(点击后触发多个组件响应)、异步任务完成通知。
优势:分离事件触发与处理逻辑,避免轮询消耗资源。
2)数据同步需求
示例:股票价格变动时,实时推送至所有订阅用户的终端;
多人游戏中玩家状态同步至其他客户端。
3)状态监控与日志
示例:服务器运行状态变更时,通知监控系统记录日志并触发警报。
4)跨模块解耦
示例:电商系统中,订单状态更新后自动通知库存、物流、支付模块。
使用示例
模拟微信公众号推送机制:公众号(被观察者)发布新文章时,所有订阅用户(观察者)收到通知。
定义被观察者
/**
* 抽象被观察者(Subject)
*/
public interface Publisher {
void addSubscriber(Subscriber s); // 添加观察者
void removeSubscriber(Subscriber s);
void notifySubscribers(String msg); // 通知所有观察者
}
定义具体被观察者
/**
* 具体被观察者:微信公众号
*/
public class WeChatPublicAccount implements Publisher {
private List<Subscriber> subscribers = new ArrayList<>();
/**
* 定义发布文章方法,该方法会触发通知观察者
*
* @param title
*/
public void publishArticle(String title) {
System.out.println("发布新文章:" + title);
notifySubscribers(title);
}
@Override
public void addSubscriber(Subscriber s) {
subscribers.add(s);
}
@Override
public void removeSubscriber(Subscriber s) {
subscribers.remove(s);
}
@Override
public void notifySubscribers(String msg) {
for (Subscriber s : subscribers) {
s.update(msg);
}
}
}
定义抽象观察者
/**
* 抽象观察者(Observer)
*/
public interface Subscriber {
void update(String msg);
}
定义具体观察者
public class User implements Subscriber {
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(String msg) {
System.out.println(name + " 收到通知:" + msg);
}
}
测试
public class Client {
public static void main(String[] args) {
WeChatPublicAccount account = new WeChatPublicAccount();
account.addSubscriber(new User("Alice"));
account.addSubscriber(new User("Bob"));
account.publishArticle("观察者模式实战指南");
}
}