Java 设计模式Android知识Java设计模式

Java设计模式 - 观察者模式

2017-12-05  本文已影响19人  a57ecf3aaaf2

定义

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

前面已经说到,命令模式在GUI系统中比较常见,而观察者模式也是如此。GUI系统可利用观察者模式,使得具体的业务逻辑与UI解耦,实现灵活的编程。

消息队列、时间总线等处理机制,都可使用观察者模式实现。

实现

定义一个学生接口:

public interface IStudent {
    void askForLeave();
    void askForRelieve();
}

然后实现一个具体的学生类,而该学生是一个被观察者:

public class Student extends Observable implements IStudent {

    @Override
    public void askForLeave() {
        setChanged();
        notifyObservers("askForLeave");
    }

    @Override
    public void askForRelieve() {
        setChanged();
        notifyObservers("askForRelieve");
    }
} 

Observable 类是 JDK 中提供的被观察者类,当调用其中的行为方法时,会通过 notifyObservers 方法通知所有的观察者。

定义一个观察者,监控学生的行为:

public class Teacher implements Observer {

    @Override
    public void update(Observable o, Object arg) {
        System.out.println(o.getClass().getSimpleName() + "有了新的活动" + (arg == null ? "" : ":" + arg));
    }
}

可以看到 Teacher 类继承了 Observer 类,Observer 也是 JDK 中提供观察者类,当被观察者有了新的活动,会通过 update方法更新 Teacher。

public class Client {

    public static void main(String[] args) {
        Student student = new Student();
        Teacher teacher = new Teacher();

        student.addObserver(teacher);

        student.askForLeave();
        student.askForRelieve();
    }
}

运行后会打印出如下结果:

Student有了新的活动:askForLeave
Student有了新的活动:askForRelieve

Android 中的观察者模式

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    private final DataSetObservable mDataSetObservable = new DataSetObservable();

    public boolean hasStableIds() {
        return false;
    }
    
    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }

    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }
    
    /**
     * Notifies the attached observers that the underlying data has been changed
     * and any View reflecting the data set should refresh itself.
     */
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }
}

阅读过 BaseAdapter 源码的童鞋,一定知道其中有一个 DataSetObservable 对象,该对象就是一个被观察者,而观察者是谁呢?

    @Override
    public void setAdapter(ListAdapter adapter) {
        if (mAdapter != null && mDataSetObserver != null) {
            mAdapter.unregisterDataSetObserver(mDataSetObserver);
        }

        ...

        if (mAdapter != null) {
            ...

            mDataSetObserver = new AdapterDataSetObserver();
            mAdapter.registerDataSetObserver(mDataSetObserver);

            ...

        } else {
            ...
        }

        ...
    }

当通过 setAdapter 方法设置适配器时,会新建一个 AdapterDataSetObserver 观察者对象,负责布局的刷新。

本文由 Fynn_ 原创,未经许可,不得转载!

上一篇 下一篇

猜你喜欢

热点阅读