观察者模式

126 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

作用:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。

创建 Subject 主题类。用一个list保存所有的观察者,添加一个notify通知方法,遍历所有观察者,依次调用通知方法。

import java.util.ArrayList;
import java.util.List;
 
public class Subject {
   
   private List<Observer> observers 
      = new ArrayList<Observer>();
   private int state;
 
   public int getState() {
      return state;
   }
 
   public void setState(int state) {
      this.state = state;
      notifyAllObservers();
   }
 
   public void attach(Observer observer){
      observers.add(observer);      
   }
 
   public void notifyAllObservers(){
      for (Observer observer : observers) {
         observer.update(this.state);
      }
   }  
}

定义接口, obj 通知数据对象

public interface Observer {
   void update(Object obj);
}

实现观察者

public class OctalObserver implement Observer{
​
   @Override
   public void update(Object obj) {
     System.out.println( "in Octal String obj: "+obj.toString()  ); 
   }
}

使用,将观察者与主体绑定,当有消息时通知观察者。

public class ObserverPatternDemo {
   public static void main(String[] args) {
      Subject subject = new Subject();
​
      Observer oct = new OctalObserver();
     
     // 添加观察者
      subject.attach(oct);
 
     subject.notifyAllObservers();
   }
}

java中的应用其一是swing中的事件EventBus,对一个按钮添加监听,按钮触发后会通知添加的监听事件EventListener。

观察者模式更像是mq消息,观察者关注哪个消息主题,当有消息是会通知所有的观察者。这样更好理解。

spring中的观察者模式

spring中的ApplicationContext上下文内容变化的时候,会通过ApplicationEvent像所有监听事件的观察者EventListener发布消息。此过程在SpringApplication.run() 启动过程查看源码尤为明显。