返回
一招鲜吃遍天,观察者与订阅发布模式全面剖析
前端
2023-07-28 11:46:15
密切关注,实时掌握:观察者模式
想象一下一个繁忙的新闻编辑室,记者争分夺秒地报道突发新闻。为了确保所有记者都能立即获得最新消息,编辑室采用了观察者模式。
观察者模式是一种设计模式,让对象(观察者)订阅并接收来自其他对象(发布者)的通知。当发布者的状态发生变化时,它会通知所有观察者,使它们可以相应地更新自己的状态或执行特定操作。
观察者模式的优势:
- 解耦发布者和观察者: 观察者模式使发布者和观察者之间保持松散耦合,便于独立开发和维护。
- 可重用性高: 观察者可以轻松订阅多个发布者,提高代码可重用性。
- 可扩展性强: 可以轻松添加或删除观察者,提高代码可扩展性。
代码示例:
// 发布者类
public class NewsPublisher {
private List<NewsObserver> observers = new ArrayList<>();
public void addObserver(NewsObserver observer) {
observers.add(observer);
}
public void removeObserver(NewsObserver observer) {
observers.remove(observer);
}
public void publishNews(String news) {
for (NewsObserver observer : observers) {
observer.update(news);
}
}
}
// 观察者类
public interface NewsObserver {
void update(String news);
}
// 具体观察者类
public class Reporter implements NewsObserver {
@Override
public void update(String news) {
System.out.println("Reporter: " + news);
}
}
// 使用观察者模式
public class Main {
public static void main(String[] args) {
NewsPublisher publisher = new NewsPublisher();
Reporter reporter1 = new Reporter();
Reporter reporter2 = new Reporter();
publisher.addObserver(reporter1);
publisher.addObserver(reporter2);
publisher.publishNews("Breaking news: A new virus discovered!");
}
}
灵活沟通,实时传递:订阅发布模式
现在,想象一个国际会议,各国代表需要随时了解最新进展。为了实现实时通信,会议采用订阅发布模式。
订阅发布模式是一种设计模式,允许对象(订阅者)订阅并接收来自其他对象(发布者)发布的消息。发布者和订阅者之间松散耦合,这意味着它们不需要知道彼此的存在。
订阅发布模式的优势:
- 解耦发布者和订阅者: 订阅发布模式使发布者和订阅者之间保持松散耦合,便于独立开发和维护。
- 可重用性高: 订阅者可以轻松订阅多个发布者,提高代码可重用性。
- 可扩展性强: 可以轻松添加或删除订阅者,提高代码可扩展性。
- 实时通信: 发布者可以立即将消息发送给所有订阅者,实现实时通信。
代码示例:
// 发布者类
public class MessageBroker {
private Map<String, List<MessageSubscriber>> subscribers = new HashMap<>();
public void publishMessage(String topic, String message) {
List<MessageSubscriber> subscribers = this.subscribers.get(topic);
if (subscribers != null) {
for (MessageSubscriber subscriber : subscribers) {
subscriber.receiveMessage(topic, message);
}
}
}
public void subscribe(String topic, MessageSubscriber subscriber) {
List<MessageSubscriber> subscribers = this.subscribers.get(topic);
if (subscribers == null) {
subscribers = new ArrayList<>();
this.subscribers.put(topic, subscribers);
}
subscribers.add(subscriber);
}
public void unsubscribe(String topic, MessageSubscriber subscriber) {
List<MessageSubscriber> subscribers = this.subscribers.get(topic);
if (subscribers != null) {
subscribers.remove(subscriber);
}
}
}
// 订阅者类
public interface MessageSubscriber {
void receiveMessage(String topic, String message);
}
// 具体订阅者类
public class Delegate implements MessageSubscriber {
@Override
public void receiveMessage(String topic, String message) {
System.out.println("Delegate: " + message);
}
}
// 使用订阅发布模式
public class Main {
public static void main(String[] args) {
MessageBroker broker = new MessageBroker();
Delegate delegate1 = new Delegate();
Delegate delegate2 = new Delegate();
broker.subscribe("news", delegate1);
broker.subscribe("sports", delegate2);
broker.publishMessage("news", "Breaking news: A new virus discovered!");
broker.publishMessage("sports", "Sports update: Local team wins championship!");
}
}
选择合适的模式,打造高性能系统
观察者模式和订阅发布模式都是非常有用的设计模式,具体选择哪种模式取决于项目的需求。
- 简单通信: 观察者模式是让对象相互通信的一种简单而有效的方法。
- 灵活通信: 订阅发布模式更灵活,支持实时通信。
无论您选择哪种模式,了解和使用它们都可以帮助您创建更灵活、更可维护和更可扩展的软件系统。
常见问题解答:
-
什么时候使用观察者模式?
当需要让对象订阅并接收来自其他对象的状态变化时。 -
什么时候使用订阅发布模式?
当需要让对象订阅并接收来自其他对象发布的消息,且需要实时通信时。 -
观察者模式和订阅发布模式有什么区别?
订阅发布模式更灵活,允许发布者发布消息,而观察者模式只允许发布者更新自己的状态。 -
如何解耦发布者和订阅者?
通过使用观察者模式或订阅发布模式,让发布者和订阅者松散耦合。 -
如何提高代码的可重用性?
通过使用观察者模式或订阅发布模式,让订阅者可以轻松订阅多个发布者。