返回

打破信息壁垒,探索观察者模式的艺术

前端

小明打算去售楼处购买一套房子。销售小姐告诉他这套住宅暂时没有房源,于是小明留下了手机号码,以便在有房源时通知他。

上面示例中,发布者就是售楼中心,订阅者就是小明,消息队列就是小明留的手机号码。观察者模式让对象之间实现了松耦合。

一个简单的观察者模式示例:

class Subject {
  private List<Observer> observers = new ArrayList<>();

  public void addObserver(Observer observer) {
    observers.add(observer);
  }

  public void removeObserver(Observer observer) {
    observers.remove(observer);
  }

  public void notifyObservers() {
    for (Observer observer : observers) {
      observer.update();
    }
  }
}

class Observer {
  public void update() {
    // Do something
  }
}

class ConcreteSubject extends Subject {
  private int state;

  public int getState() {
    return state;
  }

  public void setState(int state) {
    this.state = state;
    notifyObservers();
  }
}

class ConcreteObserver implements Observer {
  private Subject subject;

  public ConcreteObserver(Subject subject) {
    this.subject = subject;
    subject.addObserver(this);
  }

  @Override
  public void update() {
    System.out.println("Observer: " + subject.getState());
  }
}

public class Main {
  public static void main(String[] args) {
    Subject subject = new ConcreteSubject();
    Observer observer = new ConcreteObserver(subject);

    subject.setState(1);
    subject.setState(2);
  }
}

在这个示例中,Subject是抽象类,ConcreteSubject是它的具体实现。Observer是抽象类,ConcreteObserver是它的具体实现。main()方法创建了一个ConcreteSubject对象和一个ConcreteObserver对象,并将观察者添加到主题中。然后,setState()方法被调用了两次,每次都调用notifyObservers()方法,通知观察者状态已更改。观察者随后调用update()方法,打印出主题的状态。

观察者模式有许多优点,包括:

  • 松耦合:观察者和主题之间是松散耦合的,这意味着它们可以独立更改。
  • 可扩展性:可以轻松地向系统中添加新的观察者,而无需更改主题或其他观察者。
  • 代码重用:观察者模式可以帮助您重用代码,因为您可以创建可以由多个主题使用的观察者。

观察者模式在许多不同的应用程序中都很有用,包括:

  • GUI编程:观察者模式可以用于在GUI控件(如按钮和文本框)和它们的监听器之间建立通信。
  • 事件处理:观察者模式可以用于处理来自操作系统或其他应用程序的事件。
  • 数据绑定:观察者模式可以用于将数据模型与GUI控件绑定在一起,以便在数据模型发生更改时更新GUI控件。