Java设计模式 - 观察者模式

作者: a57ecf3aaaf2 | 来源:发表于2017-12-05 20:51 被阅读19次

    定义

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

    前面已经说到,命令模式在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_ 原创,未经许可,不得转载!

    相关文章

      网友评论

        本文标题:Java设计模式 - 观察者模式

        本文链接:https://www.haomeiwen.com/subject/jbfhixtx.html