发布订阅模式
编辑
55
2024-11-28
概述
在Java中,发布订阅模式(也称为观察者模式)是一种设计模式,主要用于实现一对多的依赖关系:当一个对象的状态发生变化时,所有依赖它的对象都会收到通知并自动更新。发布者Publisher
发布事件,订阅者Subscriber
订阅事件,从而解耦了发布和订阅的双方
发布者(publisher):负责发布事件或消息
订阅者(subscriber):订阅了发布者发布的事件或消息,并在事件发生时做出响应
通过泛型封装发布订阅模式可以使它支持不同类型的事件和消息,从而提高代码的复用性和灵活性。下面是一个简单的基于泛型的发布订阅模式的实现
Publisher
public interface Publisher<T> {
void subscribe(Subscriber<T> subscriber);
void unsubscribe(Subscriber<T> subscriber);
void notifySubscribers(T event);
}
Subscriber
public interface Subscriber<T> {
void update(T event);
}
示例
//发布者
Publisher<String> publisher = new Publisher<>() {
private final List<Subscriber<String>> subscribers = new ArrayList<>();
@Override
public void subscribe(Subscriber<String> subscriber) {
subscribers.add(subscriber);
}
@Override
public void unsubscribe(Subscriber<String> subscriber) {
subscribers.remove(subscriber);
}
@Override
public void onEmit(String event) {
subscribers.forEach(subscriber -> {
subscriber.update(event);
});
}
};
//订阅
publisher.subscribe(new Subscriber<String>() {
@Override
public void update(String event) {
System.out.println(event);
}
});
//发布者发送消息
publisher.onEmit("hello");
publisher.onEmit("world");
publisher.onEmit("!");
总结
优点
降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则
目标与观察者之间建立了一套触发机制
缺点
如果有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间
如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用
使用场景
对象间存在一对多关系,一个对象的状态发生改变会影响其他对象
实现类似广播机制的功能,不需要知道具体收听者,只需分发广播,系统中感兴趣的对象会自动接收该广播
多层级嵌套使用,形成一种链式触发机制,使得事件具备跨域(跨越两种观察者类型)通知
- 2
- 0
-
分享