1、基本介绍

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。 如何解决:使用面向对象技术,可以将这种依赖关系弱化。 关键代码:在抽象类里有一个 ArrayList 存放观察者们。 应用实例: 1、老板由睡觉状态改成醒来状态,工人们由此开始更努力干活。

2、具体实现

我们这里以老板、工人为例。老板开始在睡觉,后来醒了。工人观察到老板醒了,开始卖力干活。

  • 定义抽象观察者

    1. public interface Observer {
    2. // 更新
    3. public void update();
    4. }
  • 定义具体观察者

    1. public class WorkerObserver implements Observer {
    2. @Override
    3. public void update() {
    4. System.out.println("工人观察到老板醒了,开始努力干活");
    5. }
    6. }
  • 定义主题 ```java public class Subject {

    // 观察者数组 private List oVector = new ArrayList<>();

    // 增加一个观察者 public void addObserver(Observer observer) {

    1. this.oVector.add(observer);

    }

    // 删除一个观察者 public void deleteObserver(Observer observer) {

      this.oVector.remove(observer);
    

    }

    // 通知所有观察者 public void notifyObserver() {

      for (Observer observer : this.oVector) {
          observer.update();
      }
    

    }

}


- 定义具体主题(老板)
```java
public class BossSubject extends Subject {
    // 老板睡醒了
    public void wakeUp() {
        System.out.println("老板睡醒了,并且所有工人都观察到了");
        super.notifyObserver();
    }
}
  • 测试
    public class Demo {
      public static void main(String[] args) {
          // 创建一个主题,这里指的老板
          BossSubject subject = new BossSubject();
          // 定义一个观察者,这里指的工人
          Observer observer = new WorkerObserver();
          // 观察,这个老板的身上,有很多只眼睛在观察他~~~~~~
          subject.addObserver(observer);
          // 老板醒了,工人开始卖力干活
          subject.wakeUp();
      }
    }
    
    image.png