设计模式-观察者

159 阅读1分钟

观察者模式的定义

观察者(Observer)模式:是对象的行为模式,又叫做发布-订阅(Publish/Subscribe)模式。 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

在java已经提供了Observer接口和Observable抽象类 总体设计图:

总体设计图

java的观察者类源码

//提供给观察者的接口
public interface Observer {
  void update(Observable o, Object arg);
}
public class Observable {
  private boolean changed = false;
  private Vector<Observer> obs;

  public Observable() {
      obs = new Vector<>();
  }

  public synchronized void addObserver(Observer o) {
      if (o == null)
          throw new NullPointerException();
      if (!obs.contains(o)) {
          obs.addElement(o);
      }
  }

  public synchronized void deleteObserver(Observer o) {
      obs.removeElement(o);
  }

  public void notifyObservers() {
      notifyObservers(null);
  }

  public void notifyObservers(Object arg) {
  
      Object[] arrLocal;

      synchronized (this) {
          if (!hasChanged())
              return;
          arrLocal = obs.toArray();
          clearChanged();
      }

      for (int i = arrLocal.length-1; i>=0; i--)
          ((Observer)arrLocal[i]).update(this, arg);
  }

  public synchronized void deleteObservers() {
      obs.removeAllElements();
  }

  protected synchronized void setChanged() {
      changed = true;
  }

  protected synchronized void clearChanged() {
      changed = false;
  }

  public synchronized boolean hasChanged() {
      return changed;
  }

  public synchronized int countObservers() {
      return obs.size();
  }

使用

// 在前台显示数据的观察者
public class DataShowActivity extends AppCompatActivity implements Observer {

  private TextView mTextView;

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      mTextView = findViewById(R.id.txt);
  }

  @Override
  public void update(Observable o, Object arg) {
      mTextView.setText(arg.toString());
  }
}
// 数据发生改变
public class DataChange extends Observable {

  private String mName = "xxx";

  public void main() {
      setChanged();
      notifyObservers(mName);
  }

}