简单实现的观察者模式

当有多个观察者想同时观察同一个主题对象的时候,当主题对象的 状态发生变化,观察者能够回调自身的方法去更新自己。

实现的步骤:

  1. 要定义一个观察者接口。
  2. 观察者实现观察者接口。
  3. 要有一个被通知者接口,里面有addObserver(Observer observer), removeObserver(Observer observer), notifyObservers() 方法。
  4. 在被观察者发生变化的时候,调用 notifyObservers(),遍历List,回调observer里面的方法。

简单的实现一些观察者模式:

在 Android 里面有提供两个类实现观察者模式:

Observable、Observer

Observer 类:

public interface Observer {
    void update(Observable observable, Object data);
}

Observer 是一个观察者接口,observable 是被观察者,data 是被观察者传递给观察者的数据。

Observable 类:

public class Observable {

    List observers = new ArrayList();

    boolean changed = false;

    public Observable() {
    }

    public void addObserver(Observer observer) {
        if (observer == null) {
            throw new NullPointerException("observer == null");
        }
        synchronized (this) {
            if (!observers.contains(observer))
                observers.add(observer);
        }
    }

    protected void clearChanged() {
        changed = false;
    }

    public int countObservers() {
        return observers.size();
    }

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

    public synchronized void deleteObservers() {
        observers.clear();
    }

    public boolean hasChanged() {
        return changed;
    }

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

    @SuppressWarnings("unchecked")
    public void notifyObservers(Object data) {
        int size = 0;
        Observer[] arrays = null;
        synchronized (this) {
            if (hasChanged()) {
                clearChanged();
                size = observers.size();
                arrays = new Observer[size];
                observers.toArray(arrays);
            }
        }
        if (arrays != null) {
            for (Observer observer : arrays) {
                observer.update(this, data);
            }
        }
    }

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

Observable 类是被观察者,里面有实现添加观察者,移除观察者,通知观察者更新等方法。

注意到 notifyObservers 方法,里面有一个判断语句 if (hasChanged()) {},但是 setChanged 方法是一个 protected 类型,所以不能直接调用,这时需要写一个类继承它才能调用。

场景分析:
班上有两个同学趁老师不在的时候在看NBA和看漫画输,另一个童鞋负责通风报信,当老师来的时候通知他们不要再做自己的事了,因为老师来了。

首先构建两个观察者(NBA和漫画):

public class CartoonObserver implements Observer {
    @Override
    public void update(Observable observable, Object data) {
        Log.i("Observer", "我是 " +
                this.getClass().getSimpleName() + "," + data + " 别看漫画了");
    }
}

public class NBAObserver implements Observer {
    @Override
    public void update(Observable observable, Object data) {
        Log.i("Observer", "我是 " +
                this.getClass().getSimpleName() + "," + data + " 别看NBA了");
    }
}

然后实现一个被观察者:

public class SubjectObservable extends Observable {

    public SubjectObservable() {

    }

    public void subjectNotifyObservers(Object data) {
        setChanged();
        notifyObservers(data);
    }
}

实现:

SubjectObservable observable = new SubjectObservable();

CartoonObserver cartoonObserver = new CartoonObserver();
NBAObserver nbaObserver = new NBAObserver();
//添加到被观察者中
observable.addObserver(cartoonObserver);
observable.addObserver(nbaObserver);

//当老师来的时候通知观察者们老师来了
observable.subjectNotifyObservers("老师来了");

结果:

你可能感兴趣的:(简单实现的观察者模式)