观察者模式核心就一个点,记住这个点你就能理解并记忆。要点:用一个list把观察者保存起来,并提供add和remove观察者,在被观察者变化的时候就遍历并调用list里观察者的方法。核心就是一个list遍历
/**
* 通用观察者模式助手
*/
public class ObjObserver {
private static final ObjObserver ourInstance = new ObjObserver();
public static ObjObserver getInstance() {
return ourInstance;
}
private ObjObserver() {
}
private HashSet<ObjCallback> objCallbacks = new HashSet<>();
public void registerCallback(ObjCallback callback) {
if (!objCallbacks.contains(callback)) {
objCallbacks.add(callback);
}
}
public void unRegisterCallback(ObjCallback callback) {
if (objCallbacks.contains(callback)) {
objCallbacks.remove(callback);
}
}
// ObjType是我自定义的一个枚举
public void notifyObj(ObjType objType, Object object) {
for (ObjCallback callback : objCallbacks) {
Log.d("wangrui","notifyObj 2");
callback.onObserver(objType, object);
}
}
public void notifyObj(ObjType objType) {
Log.d("wangrui","notifyObj 1");
notifyObj(objType, null);
}
public interface ObjCallback {
void onObserver(ObjType objType, Object object);
}
}
使 MainActivity 成为观察者
public class MainActivity implements ObjObserver.ObjCallback{
在onCreate()开头,使观察者与被观察者签约订阅
ObjObserver.getInstance().registerCallback(this);
在被观察者发生变化时调用如下代码,就会通知到各个观察者,这就是一对多
ObjObserver.getInstance().notifyObj(ObjType.UPDATE_DATA);
当被观察者发生变化时,在观察者MainActivity实现的onObserver就会收到通知
@Override
public void onObserver(ObjType objType, Object object) {
Log.d("wangrui","收到数据 = "+objType);
}
在 onDestroy(),取消订阅,这样即使被观察者发生变化 MainActivity也不在接收通知
ObjObserver.getInstance().unRegisterCallback(this);