找回密码
 立即注册
首页 业界区 业界 观察者模式

观察者模式

战匈琼 2025-6-6 14:47:03
观察者(Observer、Publish-Subscribe:Pub/Sub)模式属于行为型模式的一种。
观察者模式是一种一对多的通知机制,让发送通知的一方(被观察者)和接收通知的一方(观察者)能彼此分离,互不影响。观察者模式的目的是要分离被观察者和观察者之间的耦合关系。
观察者模式的核心在于建立一种机制,使得当一个对象的状态变化时,所有依赖于它的对象(观察者)都能得到通知并作出相应的更新。
广义的观察者模式包括所有消息系统。消息系统,就是把观察者和被观察者完全分离,通过消息系统本身来进行通知。
在真实世界中,出版社是发布者,我们这些订阅了报纸或杂志的民众,是订阅者。出版社会在刊物出版后直接将最新一期寄送给我们,我们不用跑去出版社拿了。
Java标准库中的 java.util.Observer 类和 java.util.Observable 类,本来可以用来帮助我们实现观察者模式的。但是,这两个类在Java 9中已经被弃用了,弃用原因我就不描述了,大家可以搜一下。我们可以使用自定义的观察者模式,来满足更灵活的需求。
观察者模式通常有以下组成部分: 

  • 观察者接口:包含一个更新方法,用于接收主题的通知。
  • 具体观察者:实现观察者接口,定义接收到通知时的行为。
  • 主题接口:包含添加、删除和通知观察者的方法。
  • 具体主题:实现主题接口,管理观察者列表,并在状态改变时通知它们。
我们模拟一个简单的观察者模式。
1、观察者接口
  1. // 观察者接口
  2. public interface Observer {
  3.     void update(String message);
  4. }
复制代码
1.gif
2、具体观察者
  1. // 具体观察者
  2. public class ConcreteObserver implements Observer {
  3.     private String name;
  4.     public ConcreteObserver(String name) {
  5.         this.name = name;
  6.     }
  7.     @Override
  8.     public void update(String message) {
  9.         System.out.println(name + " received message: " + message);
  10.     }
  11. }
复制代码
2.gif
3、主题接口
  1. // 主题接口
  2. public interface Subject {
  3.     void addObserver(Observer observer);
  4.     void removeObserver(Observer observer);
  5.     void notifyObservers(String message);
  6. }
复制代码
3.gif
4、具体主题
  1. // 具体主题
  2. public class ConcreteSubject implements Subject {
  3.     private List<Observer> observers = new ArrayList<>();
  4.     @Override
  5.     public void addObserver(Observer observer) {
  6.         observers.add(observer);
  7.     }
  8.     @Override
  9.     public void removeObserver(Observer observer) {
  10.         observers.remove(observer);
  11.     }
  12.     @Override
  13.     public void notifyObservers(String message) {
  14.         for (Observer observer : observers) {
  15.             observer.update(message);
  16.         }
  17.     }
  18. }
复制代码
4.gif
5、客户端
  1. // 客户端代码
  2. public class ObserverPatternDemo {
  3.     public static void main(String[] args) {
  4.         ConcreteSubject subject = new ConcreteSubject();
  5.         Observer observer1 = new ConcreteObserver("Observer 1");
  6.         Observer observer2 = new ConcreteObserver("Observer 2");
  7.         subject.addObserver(observer1);
  8.         subject.addObserver(observer2);
  9.         subject.notifyObservers("Hello Observers!");
  10.     }
  11. }
复制代码
5.gif
观察者模式的优缺点
优点:

  • 降低耦合度:主题和观察者之间是抽象耦合的,彼此独立,易于维护和扩展。
  • 动态添加和删除观察者:可以在运行时动态地添加或删除观察者,灵活性高。
缺点:

  • 性能问题:如果观察者数量众多,通知过程可能耗时,影响性能。
  • 可能导致循环依赖:不当的设计可能导致观察者和主题之间的循环依赖,造成内存泄漏。
观察者模式是一种强大的设计模式,能够有效地解耦对象之间的关系,适用于需要在对象状态变化时通知多个依赖对象的场景。
怨天者无志,怨人者心穷。-- 烟沙九洲

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

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