浅谈Java中的观察者模式

观察者模式是软件开发中常用的一种设计模式,它通过定义一对多的依赖关系,使得一个对象(主题)的状态变化可以通知多个其他对象(观察者)。

这种模式的优点是解耦和增加扩展性,用于实现对象之间的松耦合通信。

如果要自己编码实现,我们通常定义一个主题接口(Subject)和一个观察者接口(Observer)。主题接口中包含注册观察者、移除观察者和通知观察者的方法,而观察者接口中则定义了更新状态的方法。具体的主题类和观察者类实现这些接口,并进行相应的业务逻辑实现。

考虑到实现简单点,我们假定有一个广播类,这个广播类实际上就是一个主题Subject,有多个听众收听这个广播,这里每个听众就是一个观察者Observer

定义一个主题Subject的接口类

/**
 * 主题,被观察者
 */
public interface Subject {

  /**
   * 添加观察者
   */
  void addObserver(Observer observer);

  /**
   * 移除观察者
   */
  void removeObserver(Observer observer);

  /**
   * 通知观察者
   */
  void notifyObserver(String message);
}

定义一个观察者Observer的接口类

/**
 * 观察者
 */
public interface Observer {

  void recieve(String message);

}

接下来,就是定义一个广播的类,用来实现主题接口 

/**
 * 广播,负责向听众广播消息
 */
public class Broadcast implements Subject{

  private final List observerList = new ArrayList<>();

  @Override
  public void addObserver(Observer observer) {
    observerList.add(observer);
  }

  @Override
  public void removeObserver(Observer observer) {
    observerList.remove(observer);
  }

  @Override
  public void notifyObserver(String message) {
    for (Observer observer : observerList) {
      observer.recieve(message);
    }
  }
}

再定义一个听众类,用来实现观察者接口

public class Audience implements Observer {

  private final String name;

  public Audience(String name) {
    this.name = name;
  }

  @Override
  public void recieve(String message) {
    System.out.println(name + " received message: " + message);
  }
}

 写一个测试类来测试结果

public class Test {

  public static void main(String[] args) {
    Broadcast broadcast = new Broadcast();

    Audience audience1 = new Audience("哈尔滨听众");
    Audience audience2 = new Audience("大庆听众");

    broadcast.addObserver(audience1);
    broadcast.addObserver(audience2);

    broadcast.notifyObserver("中央电视台黑龙江电视台");
    broadcast.notifyObserver("黑龙江电视台中央电视台");

    broadcast.removeObserver(audience2);

    broadcast.notifyObserver("大庆听众关了广播");
  }

}

结果打印如下 

浅谈Java中的观察者模式_第1张图片

解释一下,广播了两拨消息,2名听众都收到了这两拨消息。后面移除了一个听众,广播了第三波消息,这时,只有剩下的那个听众收到了广播消息

你可能感兴趣的:(观察者模式)