美文网首页
简单实现的观察者模式

简单实现的观察者模式

作者: L_Xian | 来源:发表于2016-08-03 09:48 被阅读36次

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

    实现的步骤:

    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<Observer> observers = new ArrayList<Observer>();
    
        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("老师来了");
    

    结果:

    相关文章

      网友评论

          本文标题:简单实现的观察者模式

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