什么是观察者设计模式?

打印 上一主题 下一主题

主题 876|帖子 876|积分 2628

什么是观察者

观察者模式的重要角色包罗:

  • 主题(Subject): 也称为被观察者或可观察对象。它维护了一系列观察者对象,并提供方法用于注册、删除和通知观察者。当主题的状态发生改变时,它会通知所有注册的观察者。
  • 观察者(Observer): 观察主题的对象。观察者界说了一个更新方法,主题在状态改变时会调用这个方法来通知观察者。观察者可以根据主题的通知来执行相应的操纵。

观察者的应用

观察者模式在实际应用中常常用于处置惩罚事件驱动的编程场景,如图形用户界面(GUI)开发、消息通报系统等。通过观察者模式,可以实现对象之间的解耦,进步系统的机动性和可维护性。
在Spring Framework中,观察者模式的应用非常广泛,尤其在Spring的事件驱动机制中。Spring的事件机制允许对象在特定事件发生时发布事件,并允许其他对象注册为监听器以吸收这些事件。这与观察者模式的概念非常相似,其中事件源就是观察者模式中的主题,而事件监听器就是观察者。
应用步伐事件: Spring允许应用步伐发布自界说事件,并提供了ApplicationEvent和ApplicationListener接口。应用步伐可以创建自界说事件类,并在需要时发布这些事件。其他对象可以实现ApplicationListener接口并注册为监听器,以吸收并处置惩罚这些事件。
Spring MVC事件: 在Spring MVC中,可以使用 ApplicationEventPublisher 接口发布自界说事件,并通过@EventListener注解或实现 ApplicationListener 接口的方式来处置惩罚这些事件。这使得在MVC架构中进行解耦和处置惩罚事件变得更加轻易。
怎样实现

日常中比较经典的实例场景 , 举个例子,如博客园的文章订阅, 当关注的作者发布了新的文章后,关注其的粉丝就会收到消息通知,这里将代码拆出来如下。
  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(String news);
  8. }
  9. // 观察者接口
  10. interface Observer {
  11.     void update(String news);
  12. }
  13. // 新闻发布者
  14. class NewsPublisher implements Subject {
  15.     private List<Observer> observers = new ArrayList<>();
  16.     @Override
  17.     public void registerObserver(Observer observer) {
  18.         observers.add(observer);
  19.     }
  20.     @Override
  21.     public void removeObserver(Observer observer) {
  22.         observers.remove(observer);
  23.     }
  24.     @Override
  25.     public void notifyObservers(String news) {
  26.         for (Observer observer : observers) {
  27.             observer.update(news);
  28.         }
  29.     }
  30.     public void publishNews(String news) {
  31.         System.out.println("发布新闻: " + news);
  32.         notifyObservers(news);
  33.     }
  34. }
  35. // 观察者 - 读者
  36. class Reader implements Observer {
  37.     private String name;
  38.     public Reader(String name) {
  39.         this.name = name;
  40.     }
  41.     @Override
  42.     public void update(String news) {
  43.         System.out.println(name + " 收到新闻: " + news);
  44.     }
  45. }
  46. public class ObserverPatternExample {
  47.         // 创建新闻发布者
  48.         NewsPublisher publisher = new NewsPublisher();
  49.         // 创建两个观察者(读者)
  50.         Observer reader1 = new Reader("小明");
  51.         Observer reader2 = new Reader("小红");
  52.         // 注册观察者
  53.         publisher.registerObserver(reader1);
  54.         publisher.registerObserver(reader2);
  55.         // 发布新闻
  56.         publisher.publishNews("Java 21发布了!");
  57.         publisher.publishNews("Spring Framework 更新了!");
  58.         // 读者取消订阅
  59.         publisher.removeObserver(reader2);
  60.         // 再次发布新闻
  61.         publisher.publishNews("小米 su7 上线了,雷总为你开车门,快行动起来吧!");
  62.     }
  63. }
复制代码
步伐运行日志如下
  1. 发布新闻: Java 21发布了!
  2. 小明 收到新闻: Java 21发布了!
  3. 小红 收到新闻: Java 21发布了!
  4. 发布新闻: Spring Framework 更新了!
  5. 小明 收到新闻: Spring Framework 更新了!
  6. 小红 收到新闻: Spring Framework 更新了!
  7. 发布新闻: 小米 su7 上线了,雷总为你开车门,快行动起来吧!
  8. 小明 收到新闻: 小米 su7 上线了,雷总为你开车门,快行动起来吧!
复制代码
结语

这里介绍观察者,是盼望从易于理解的概念开始对 Reactive Programing 的理解,在相应式编程中多数基于观察者模式头脑演变而来,如在 Reactor 中,订阅者(Subscriber)订阅了数据流(Publisher),并在数据流中的元素发生变革时吸收通知。
通知机制: 在观察者模式中,主题状态的变革会触发通知,通知会被发送给所有注册的观察者。在Reactor中,数据流中的元素发生变革时会触发通知,通知会被发送给所有订阅了该数据流的订阅者。
事件驱动编程: 观察者模式和 Reactor 都支持事件驱动的编程模型。在观察者模式中,事件源(主题)发生事件(状态变革),并通知观察者。在 Reactor 中,事件(数据元素)在流中通报,并且订阅者可以对这些事件进行相应式地处置惩罚。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表