您的位置:

Java观察者模式的应用与解析

Java观察者模式是一种常用的设计模式,它的应用使得我们可以通过在对象之间建立一对多依赖关系来实现消息通信。在本篇文章中,我们将通过三个方面对Java观察者模式做详细的阐述:

一、观察者模式代码剖析

1、观察者模式的定义

  /**
   * The Observable class represents an observable object.
   * An observable object can have one or more observers. 
   * An observer may be any object that implements interface Observer.
   * After an observable instance Changes, an application calling the 
   * Observable's notifyObservers method causes all of its observers 
   * to be notified of the change by a call to their update method.
   */
  public class Observable {
      ...
  }
  
  /**
   * The Observer interface is implemented by objects that observe 
   * Observable objects.
   */
  public interface Observer {
      /**
       * This method is called whenever the observed object is changed.
       * An application calls an Observable object's notifyObservers 
       * method to have all the object's observers notified of the change.
       */
      void update(Observable o, Object arg);
  }

2、Java观察者模式的实现

  // 步骤1: 创建一个被观察的对象
  public class ObservableObject extends Observable {
      ...
      // 步骤2: 添加一个观察者
      public void addObserver(Observer o) {
          ...
      }
      ...
      // 步骤3: 当对象状态发生改变时,通知所有观察者
      public void notifyObservers(Object arg) {
          ...
      }
  }
  
  // 步骤4: 创建观察者
  public class ObserverObject implements Observer {
      ...
      // 步骤5: 实现观察者的更新方法
      public void update(Observable o, Object arg) {
          ...
      }
  }

二、观察者模式类图分析

1、观察者模式的类图

观察者模式类图

2、类图分析

Subject(被观察者):它是指被观察的对象。它需要注册观察者,以便在发生特定事件时通知观察者。

ConcreteSubject(具体被观察者):它是指具体的被观察者对象,它包含了具体的业务逻辑,并且在状态发生改变时,向它的观察者发出通知。

Observer(观察者):它是指观察者的抽象。在接收到被观察者的通知后,观察者通过update()方法进行响应。

ConcreteObserver(具体观察者):它是指具体的观察者对象,具体实现了抽象观察者中定义的update()方法,在得到被观察者通知时进行更新自己的状态。

三、Java观察者模式的应用

1、Java观察者模式的优点

(1)观察者模式解耦了待观察和观察者之间的耦合。

(2)Java观察者模式支持广播通信。

(3)观察者模式支持任意数量的观察者。

(4)Java观察者模式遵循了开闭原则。

2、Java观察者模式的缺点

(1)建立Java观察者模式需要额外的抽象层。

(2)Java观察者模式可能导致意外更新。

(3)Java观察者模式需要全面的测试。

3、Java观察者模式的实现方式

(1)通过继承Observable类和实现Observer接口实现观察者模式。

(2)通过回调函数模式实现观察者模式。

(3)通过消息队列模式实现观察者模式。

以上就是关于Java观察者模式的详细阐述,相信通过本文的介绍,读者已经能够对Java观察者模式进行初步的了解,从而更好地进行实践和运用。

附:观察者模式Java代码示例

// Java观察者模式实现代码
public class ObserverPatternTest {
    public static void main(String[] args) {
        // 步骤1: 创建一个被观察的对象
        ObservableObject observable = new ObservableObject();

        // 步骤2: 添加观察者
        observable.addObserver(new ObserverObject());

        // 步骤3: 当对象状态发生改变时,通知所有观察者
        observable.notifyObservers("Object has changed!");
    }
}

// 被观察者
public class ObservableObject extends Observable {
    public void notifyObservers(Object arg) {
        setChanged();
        super.notifyObservers(arg);
    }
}

// 观察者
public class ObserverObject implements Observer {
    public void update(Observable o, Object arg) {
        System.out.println("Object has changed!");
    }
}