设计模式之发布-订阅模式(三)
2023-12-08 19:24:41
<#!DOCTYPE html>
释放发布-订阅模式的内存压力:如何运用观察者模式
在上一篇文章中,我们实现了一个简单的发布-订阅模式。这种模式允许发布者向订阅者发送消息,而订阅者可以对这些消息做出反应。然而,这种模式存在两个很严重的缺点。
第一个缺点是,每个发布者都要有添加订阅者、发布消息、移除订阅者的方法,还要需要一个缓存订阅者的列表。这严重浪费了内存资源。
第二个缺点是,发布者和订阅者之间存在紧耦合,这使得代码难以维护和扩展。
为了解决这些问题,我们可以使用观察者模式。观察者模式是一种设计模式,它允许对象之间进行松散耦合。在观察者模式中,发布者和订阅者之间没有直接的联系。相反,发布者将消息发布到一个中央位置,订阅者可以从该位置获取消息。
使用观察者模式可以解决发布-订阅模式的两个缺点。首先,观察者模式可以减少内存的使用。因为每个发布者不再需要缓存订阅者的列表,所以内存的使用量会减少。其次,观察者模式可以实现发布者和订阅者之间的松散耦合。这使得代码更容易维护和扩展。
下面是一个使用观察者模式实现的发布-订阅模式的示例:
class Publisher {
private List<Subscriber> subscribers;
public Publisher() {
subscribers = new ArrayList<>();
}
public void addSubscriber(Subscriber subscriber) {
subscribers.add(subscriber);
}
public void removeSubscriber(Subscriber subscriber) {
subscribers.remove(subscriber);
}
public void publishMessage(String message) {
for (Subscriber subscriber : subscribers) {
subscriber.receiveMessage(message);
}
}
}
class Subscriber {
private String name;
public Subscriber(String name) {
this.name = name;
}
public void receiveMessage(String message) {
System.out.println(name + " received message: " + message);
}
}
public class Main {
public static void main(String[] args) {
Publisher publisher = new Publisher();
Subscriber subscriber1 = new Subscriber("Alice");
Subscriber subscriber2 = new Subscriber("Bob");
Subscriber subscriber3 = new Subscriber("Carol");
publisher.addSubscriber(subscriber1);
publisher.addSubscriber(subscriber2);
publisher.addSubscriber(subscriber3);
publisher.publishMessage("Hello world!");
}
}
在这个示例中,Publisher类代表发布者,Subscriber类代表订阅者。Publisher类有一个方法addSubscriber(),用于添加订阅者。它还有一个方法removeSubscriber(),用于移除订阅者。它还有一个方法publishMessage(),用于发布消息。Subscriber类有一个方法receiveMessage(),用于接收消息。
在main()方法中,我们创建了一个Publisher对象和三个Subscriber对象。然后,我们将Subscriber对象添加到Publisher对象中。最后,我们调用Publisher对象的publishMessage()方法来发布消息。
当我们运行这个程序时,我们会看到如下输出:
Alice received message: Hello world!
Bob received message: Hello world!
Carol received message: Hello world!
这个示例演示了如何使用观察者模式来实现发布-订阅模式。观察者模式可以减少内存的使用量,并实现发布者和订阅者之间的松散耦合。这使得代码更容易维护和扩展。