当前位置:   article > 正文

设计模式—观察者模式与发布订阅

设计模式—观察者模式与发布订阅

观察者设计模式

观察者设计模式(Observer Design Pattern)是一种常用的软件设计模式,它是一种行为型模式。该模式用于定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。

结构

观察者模式通常涉及以下几个角色:

  1. Subject(主题):主题是被观察的对象,它包含了需要被观察的状态。当主题状态发生变化时,它会通知所有的观察者对象。

  2. Observer(观察者):观察者是依赖于主题的对象,它们将在主题状态发生变化时得到通知,并进行相应的更新操作。

  3. ConcreteSubject(具体主题):具体主题是主题的具体实现,它维护了一组观察者对象,并在状态发生改变时通知它们。

  4. ConcreteObserver(具体观察者):具体观察者实现了观察者接口,在收到主题通知时执行特定的更新操作。

示例

以下是一个简单的观察者模式的示例,假设我们有一个主题(Subject)代表气象站,而观察者(Observer)是一组天气显示板,它们会在气象站更新数据时自动更新显示:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. // 主题接口
  4. interface Subject {
  5. void registerObserver(Observer observer);
  6. void removeObserver(Observer observer);
  7. void notifyObservers();
  8. }
  9. // 观察者接口
  10. interface Observer {
  11. void update(float temperature, float humidity, float pressure);
  12. }
  13. // 具体主题
  14. class WeatherData implements Subject {
  15. private List<Observer> observers;
  16. private float temperature;
  17. private float humidity;
  18. private float pressure;
  19. public WeatherData() {
  20. observers = new ArrayList<>();
  21. }
  22. public void registerObserver(Observer observer) {
  23. observers.add(observer);
  24. }
  25. public void removeObserver(Observer observer) {
  26. observers.remove(observer);
  27. }
  28. public void notifyObservers() {
  29. for (Observer observer : observers) {
  30. observer.update(temperature, humidity, pressure);
  31. }
  32. }
  33. public void measurementsChanged() {
  34. notifyObservers();
  35. }
  36. public void setMeasurements(float temperature, float humidity, float pressure) {
  37. this.temperature = temperature;
  38. this.humidity = humidity;
  39. this.pressure = pressure;
  40. measurementsChanged();
  41. }
  42. }
  43. // 具体观察者
  44. class CurrentConditionsDisplay implements Observer {
  45. private float temperature;
  46. private float humidity;
  47. public void update(float temperature, float humidity, float pressure) {
  48. this.temperature = temperature;
  49. this.humidity = humidity;
  50. display();
  51. }
  52. public void display() {
  53. System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
  54. }
  55. }
  56. // 测试
  57. public class WeatherStation {
  58. public static void main(String[] args) {
  59. WeatherData weatherData = new WeatherData();
  60. CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();
  61. weatherData.registerObserver(currentDisplay);
  62. weatherData.setMeasurements(80, 65, 30.4f);
  63. }
  64. }

发布订阅者模式

发布-订阅者模式(Publish-Subscribe Pattern)是一种软件设计模式,用于实现消息的发布和订阅机制,也被称为观察者模式的变体。在发布-订阅者模式中,消息的发布者(发布者)和消息的接收者(订阅者)之间没有直接的依赖关系,它们通过一个称为"消息代理"或"事件总线"的中介来进行通信。这种模式允许组件之间松耦合地通信,从而提高系统的可扩展性和灵活性。

结构

发布-订阅者模式通常包括以下几个关键部分:

  1. 发布者(Publisher):负责发布消息或事件到消息代理。

  2. 订阅者(Subscriber):注册对特定类型的消息或事件感兴趣,并在消息到达时执行相应的操作。

  3. 消息代理(Message Broker):作为发布者和订阅者之间的中介,负责管理消息的路由和传递。它维护了发布者和订阅者之间的关系,并在消息到达时将消息传递给所有订阅者。

示例

以下是一个简单的发布-订阅者模式的示例,假设我们有一个新闻发布系统,包括新闻发布者和新闻订阅者:

  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. // 消息代理
  6. class MessageBroker {
  7. private Map<String, List<Subscriber>> topics = new HashMap<>();
  8. public void subscribe(String topic, Subscriber subscriber) {
  9. topics.computeIfAbsent(topic, k -> new ArrayList<>()).add(subscriber);
  10. }
  11. public void publish(String topic, String message) {
  12. List<Subscriber> subscribers = topics.get(topic);
  13. if (subscribers != null) {
  14. for (Subscriber subscriber : subscribers) {
  15. subscriber.receive(message);
  16. }
  17. }
  18. }
  19. }
  20. // 订阅者接口
  21. interface Subscriber {
  22. void receive(String message);
  23. }
  24. // 新闻订阅者
  25. class NewsSubscriber implements Subscriber {
  26. private String name;
  27. public NewsSubscriber(String name) {
  28. this.name = name;
  29. }
  30. public void receive(String message) {
  31. System.out.println(name + " received news: " + message);
  32. }
  33. }
  34. // 新闻发布者
  35. class NewsPublisher {
  36. private MessageBroker messageBroker;
  37. public NewsPublisher(MessageBroker messageBroker) {
  38. this.messageBroker = messageBroker;
  39. }
  40. public void publishNews(String topic, String news) {
  41. messageBroker.publish(topic, news);
  42. }
  43. }
  44. // 测试
  45. public class NewsSystem {
  46. public static void main(String[] args) {
  47. MessageBroker messageBroker = new MessageBroker();
  48. NewsPublisher publisher = new NewsPublisher(messageBroker);
  49. publisher.publishNews("sports", "New record set in 100m sprint!");
  50. publisher.publishNews("technology", "New smartphone announced!");
  51. NewsSubscriber subscriber1 = new NewsSubscriber("John");
  52. NewsSubscriber subscriber2 = new NewsSubscriber("Alice");
  53. messageBroker.subscribe("sports", subscriber1);
  54. messageBroker.subscribe("technology", subscriber2);
  55. publisher.publishNews("sports", "Team wins championship!");
  56. }
  57. }

发布-订阅者模式在事件驱动的系统中非常有用,它可以使系统中的各个组件彼此解耦,并提供一种灵活的通信机制。

观察者vs发布订阅

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/300736
推荐阅读