当前位置:   article > 正文

【设计模式】用Java实现观察者模式_java观察者模式的实现

java观察者模式的实现

一.观察者模式介绍与使用场景

观察者模式是一种行为设计模式,用于实现对象之间的发布-订阅机制。在该模式中,存在一个主题对象(被观察者),它维护了一个观察者列表,并在自身状态发生改变时通知所有观察者。观察者对象订阅主题对象的状态变化,并在收到通知后执行相应的操作。

观察者模式通常由以下几个角色组成:

  • 主题(Subject):主题是被观察的对象,它维护了一组观察者,并提供了用于添加、删除和通知观察者的方法。

  • 观察者(Observer):观察者是订阅主题对象的对象,它定义了接收通知和执行相应操作的方法。

观察者模式的核心思想是将主题和观察者解耦,使得它们可以独立变化。主题对象在状态发生变化时,会自动通知观察者对象,而无需观察者主动轮询状态变化。

使用场景:

  • 当一个对象的状态变化需要通知其他对象,并且不希望主动耦合到这些对象时,观察者模式非常有用。通过将观察者注册到主题对象,主题对象在状态变化时会自动通知观察者,而无需观察者主动轮询状态变化。

  • 当一个对象的状态变化可能会引起其他多个对象的更新或处理时,观察者模式可以帮助我们实现对象间的解耦。观察者模式使得主题对象和观察者对象之间的关系变得灵活,可以随时添加、移除或替换观察者,而不影响其他对象的行为。

  • 当系统中存在一对多的依赖关系,一个对象的变化需要通知多个对象时,观察者模式能够提供一种简单且可扩展的设计方案。主题对象充当发布者,而观察者对象充当订阅者,它们之间形成了一种松耦合的发布-订阅机制。

  • 当需要在不同层级或模块之间进行消息传递和事件处理时,观察者模式可以帮助我们实现这种通信机制。主题对象作为事件源,观察者对象作为事件处理者,它们之间通过事件通知进行交互。

总结,观察者模式适用于以下情况:

  • 一个对象的状态变化需要通知其他对象,并且不希望主动耦合到这些对象。
  • 一个对象的状态变化可能会引起其他多个对象的更新或处理。
  • 系统中存在一对多的依赖关系,一个对象的变化需要通知多个对象。
  • 需要在不同层级或模块之间进行消息传递和事件处理。

通过使用观察者模式,我们可以实现对象间的解耦,提高系统的可维护性和扩展性。同时,观察者模式也符合开闭原则,因为可以动态添加和移除观察者,而无需修改主题对象的代码。

二.观察者模式实现

下面我们用一个简单的demo来描述一下观察者模式:

  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. class Product implements Subject {
  11. private List<Observer> observers;
  12. private String name;
  13. public Product(String name) {
  14. this.observers = new ArrayList<>();
  15. this.name = name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. notifyObservers();
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void registerObserver(Observer observer) {
  25. observers.add(observer);
  26. }
  27. public void removeObserver(Observer observer) {
  28. observers.remove(observer);
  29. }
  30. public void notifyObservers() {
  31. for (Observer observer : observers) {
  32. observer.update(this);
  33. }
  34. }
  35. }
  36. // 观察者
  37. interface Observer {
  38. void update(Subject subject);
  39. }
  40. // 具体观察者 - 用户
  41. class User implements Observer {
  42. private String name;
  43. public User(String name) {
  44. this.name = name;
  45. }
  46. public void update(Subject subject) {
  47. if (subject instanceof Product) {
  48. Product product = (Product) subject;
  49. System.out.println(name + " received a notification: " + product.getName() + " is now available.");
  50. }
  51. }
  52. }
  53. // 使用示例
  54. public class Main {
  55. public static void main(String[] args) {
  56. // 创建主题对象
  57. Product product = new Product("iPhone 13");
  58. // 创建观察者对象
  59. User user1 = new User("John");
  60. User user2 = new User("Alice");
  61. // 注册观察者
  62. product.registerObserver(user1);
  63. product.registerObserver(user2);
  64. // 修改主题状态并通知观察者
  65. product.setName("iPhone 14");
  66. }
  67. }

在上述示例中,我们模拟了一个商品发布订阅的场景。主题对象 Product 是被观察的对象用户对象 User 是观察者。当商品名称发生变化时,主题对象会通知所有观察者对象。

通过 Subject 接口,主题对象提供了注册、移除和通知观察者的方法。具体主题类 Product 实现了主题接口,并维护了观察者列表。在商品名称发生变化时,它会调用 notifyObservers() 方法,遍历观察者列表并调用观察者的 update() 方法。

观察者类 User 实现了观察者接口,并定义了收到通知后的具体操作。在 Main 类的 main 方法中,我们创建了一个商品对象和两个用户对象,并注册用户对象为观察者。当商品名称变化时,观察者会收到通知并执行相应的操作。

通过使用观察者模式,我们能够实现对象之间的松耦合关系,使得主题对象和观察者对象可以独立变化。主题对象无需关心具体的观察者,只需通知它们即可。同时,观察者模式也使得我们能够轻松地添加、移除和管理观察者,以满足动态变化的需求。

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

闽ICP备14008679号