天上的星

天上的星

发布订阅模式

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("!");

总结

优点

  • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则

  • 目标与观察者之间建立了一套触发机制

缺点

  • 如果有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间

  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用

使用场景

  • 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象

  • 实现类似广播机制的功能,不需要知道具体收听者,只需分发广播,系统中感兴趣的对象会自动接收该广播

  • 多层级嵌套使用,形成一种链式触发机制,使得事件具备跨域(跨越两种观察者类型)通知