设计模式(十八):观察者模式

191 阅读1分钟

介绍

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

优点

  • 观察者和被观察者是抽象耦合的。
  • 建立一套触发机制。

缺点

  • 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间
  • 观察者和被观察者如果相互依赖的话,可能循环崩溃

应用

Android中的Lifecycles,消息处理机制、广播、set某listener

在日常开发中,回调的使用场景非常多,比如按钮的点击事件,网络的请求结果等等,它表示的是对某一将来可能发生事件的监听。如果对某一个事件有多个监听,就需要在事件触发者里创建监听者列表,然后在事件发生时挨个通知注册过的监听者。这就是“观察者模式”。

实现

关键代码:被观察者修改信息,自动通知观察者

import java.util.ArrayList;
import java.util.List;
 
class Subject {
   
   private List<Observer> observers = new ArrayList<Observer>();
   private String state;
 
   public String getState() {
      return state;
   }

   public void changeState(String state) {
      this.state = state;
      notifyAllObservers();
   }

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

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

abstract class Observer {
    protected Subject subject;
    public abstract void update();
}

class RealObserver extends Observer{
 
    public RealObserver(Subject subject){
       this.subject = subject;
       this.subject.attach(this);
    }

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

class ObserverPatternDemo {
    public static void main(String[] args) {
       Subject subject = new Subject();

       new RealObserver(subject);

       subject.changeState("Hello!");

       subject.changeState("Good afternoon");
    }
 }
OBSERVER: Data is: Hello!
OBSERVER: Data is: Good afternoon