您的位置:首页 > 移动开发 > Android开发

重温观察者模式:Android里很常用的模式之一

2016-06-15 16:12 555 查看
今天在看rxJava的时候发现又是使用的观察者模式,这个模式在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的隐私窥探完了,观察者模式先写到这里,有兴趣的自己去看看其他的实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: