Android 观察者模式

观察者模式,定义了对象间一种一对多的依赖关系,当被观察者状态发生变化时,它的观察者们会收到通知并自动更新。

应用
在java语言的java.util库里面,提供了一个Observable类以及一个Observer接口,构成Java语言对观察者模式的支持。

Android 观察者最常见有addTextChangedListener等。

Observable/Observer示例
Oservable被观察者
被观察者,一个被观察者对象可以有数个观察者对象

public class ConcreteObservable extends Observable {
  private int data = 0;

public int getData() {
    return data;
}

public void setData(int i) {
    //具体逻辑按需
    if (data != i) {
        this.data = i;
        setChanged();
    }
}

private static ConcreteObservable observable;

public static synchronized ConcreteObservable getInstance() {
    if (observable == null) {
        observable = new ConcreteObservable();
    }
    return observable;
}

public ConcreteObservable post() {
    //只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。
    notifyObservers();
    return observable;
}

public ConcreteObservable post(Object arg) {
    setChanged();
    //只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。
    notifyObservers(arg);
    return observable;
}}

Observable 源码:

public class Observable {

  private boolean changed = false;
  private final ArrayList<Observer> observers;

/** Construct an Observable with zero Observers. */

public Observable() {
    observers = new ArrayList<>();
}

/**     
 * 将一个观察者添加到观察者集合     
 */
public synchronized void addObserver(Observer o) {
    if (o == null)
        throw new NullPointerException();
    if (!observers.contains(o)) {
        observers.add(o);
    }
}

/**     
 * 删除观察者     
 */
public synchronized void deleteObserver(Observer o) {
    observers.remove(o);
}

/**     
 * 如果该对象发生了变化,由所指示的 hasChanged方法,则通知其所有观察者,并调用clearChanged方法来指示该对象不再改变     
 */
public void notifyObservers() {
    notifyObservers(null);
}

/**     
 * 如果该对象发生了变化,由所指示的 hasChanged方法,则通知其所有观察者,并调用clearChanged方法来指示该对象不再改变     
 */
public void notifyObservers(Object arg) {

    Observer[] arrLocal;

    synchronized (this) {

        if (!hasChanged())
            return;

        arrLocal = observers.toArray(new Observer[observers.size()]);
        clearChanged();
    }

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

/**     
 * 清除观察者列表,不再有任何观察者     
 */
public synchronized void deleteObservers() {
    observers.clear();
}

/**     
 * 观测对象为已改变     
 */
protected synchronized void setChanged() {
    changed = true;
}

/**     
 * 指示对象不再改变,或者说,它已通知其所有最近改变其观察员     
 */
protected synchronized void clearChanged() {
    changed = false;
}

/**     
 * 测试此对象已经改变     
 */
public synchronized boolean hasChanged() {
    return changed;
}

/**     
 * 返回观察者人数     
 */
public synchronized int countObservers() {
    return observers.size();
}}

Observer 观察者

Observer 是个接口,在需要观察的地方实现:

  public class ObserverActivity extends AppCompatActivity implements Observer {
   ConcreteObservable observable;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_observer);
    observable = ConcreteObservable.getInstance();
    observable.addObserver(this);
    observable.setData(1);
    observable.post();
    observable.setData(1);
    observable.post();
    observable.post(2);
}

@Override
public void update(Observable o, Object arg) {
    ConcreteObservable concreteObservable = (ConcreteObservable) o;
    Log.d("wxl", "ObserverActivity=" + concreteObservable.getData() + ",arg=" + arg);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    //删除观察者
    observable.deleteObserver(this);
}}

Observer源码:

public interface Observer {
/**
* 当被观察者对象的状态发生变化时,被观察者对象的notifyObservers()方法就会* 调用这一方法。
*/
void update(Observable o, Object arg);}

最后打印:

ObserverActivity=1,arg=null
ObserverActivity=1,arg=2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值