设计模式(二)重温观察者模式:随便窥探一波BaseAdapter源码

今天在看rxJava的时候发现又是使用的观察者模式,这个模式在android开发里面使用频率挺高的,思想是知道的,还是觉得按照自己的理解用代码再写一遍加深一下认识比较好

观察者模式在android中非常重要,很多开源框架或者源码里面大量使用到,比如RXJava,EventBus,安卓里面的adapter,ContentProvider等等都使用到这个模式。


观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新



有了这图基本代码就可以写了,其他不多说直接上代码

/**
 * Created by roman on 2016/6/15.
 * 观察者
 */
public interface Observer {

    /**
     * 收到通知的响应
     * @param text
     */
    void update(String text);
}


/**
 * Created by roman on 2016/6/15.
 * 具体观察者
 */
public class ConcreteObserver implements Observer {

    @Override
    public void update(String text) {
        Log.d("ConcreteObserver", "收到" + text + "通知!!!");
    }
}

/**
 * Created by roman on 2016/6/15.
 * 被观察者
 */
public interface Subject<T extends Observer> {

    /**
     * 注册观察者
     * @param observer
     */
    void registerObserver(T observer);

    /**
     * 反注册观察者
     * @param observer
     */
    void unRegisterObserver(T observer);

    /**
     * 通知所有观察者变化
     */
    void notifyObservers(String msg);
}



/**
 * Created by roman on 2016/6/15.
 * 具体被观察者
 */
public class ConcreteSubject<T extends Observer> implements Subject<T> {

    //所有观察者
    private List<T> observerList = new ArrayList<>();

    @Override
    public void registerObserver(T observer) {
        synchronized (observerList) {
            if (observer != null && !observerList.contains(observer)) {
                observerList.add(observer);
            } else {
                throw new RuntimeException("register observer error");
            }
        }
    }

    @Override
    public void unRegisterObserver(T observer) {
        synchronized (observerList) {
            if (observer != null && observerList.contains(observer)) {
                observerList.remove(observer);
            } else {
                throw new RuntimeException("unRegister observer error");
            }
        }
    }

    @Override
    public void notifyObservers(String msg) {
        synchronized (observerList) {
            for (T observer : observerList) {
                observer.update(msg);
            }
        }
    }
}


用一个小例子使用起来看看

/**
 * 观察者模式demo
 */
public class ObserverActivity extends AppCompatActivity {

    //老师在讲台告诉全班学生下午放假的通知
    private Subject<Observer> mTeacher = new ConcreteSubject<>();
    private Observer mStudent1 = new ConcreteObserver();
    private Observer mStudent2 = new ConcreteObserver();
    private Observer mStudent3 = new ConcreteObserver();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_observer);

        mTeacher.registerObserver(mStudent1);
        mTeacher.registerObserver(mStudent2);
        mTeacher.registerObserver(mStudent3);

        mTeacher.notifyObservers("同学们今天儿童节下午放假");//告诉

        mTeacher.unRegisterObserver(mStudent1);
        mTeacher.unRegisterObserver(mStudent2);
        mTeacher.unRegisterObserver(mStudent3);
    }
}

3个观察者都收到



其实思想挺简单的,写完自己的代码,再去翻翻别人SDK里源码是怎么写的,看看有没有什么惊喜


拿我们最熟悉的BaseAdapter开刀



红色的部分是不是很熟悉,BaseAdapter里面藏有一个被观察者,再点进去看看怎么写的



基本一样就是使用的是一个泛型抽象类,我们用的是接口,还有抛出的异常不一样抛IllegalStateException比较符合


再进去看一下具体实现类找到了我们最熟悉的notifyDataSetChanged的实现notifyChanged方法,主要也是遍历调用


被观察者看完了,再看看观察者,点进去那个DataSetObserver看看,其实里面基本就是一个改变的方法


好adapter的隐私窥探完了,观察者模式先写到这里,有兴趣的自己去看看其他的实现

 

猜你喜欢

转载自blog.csdn.net/PK0071/article/details/51682707