什么是观察者模式了?百度一搜,讲了一大推理论,貌似还很有道理,不过对于一个程序员来说,理论终究要去实践了。直接举几个代码例子:
1. setListener(xxxListenr)
2. addListener(xxxListenr) 常与removeListener(xxxListenr)
3. register(xxxListenr)与ungister(xxxListenr)(广播)
讲到这里,是不是大脑中已经很形象的想到了某些例子。我们来看下理论是如何说:
观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计
模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼
叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
大体上已经有些概念,总的来说是相当于一个广播,广播的任务是什么,是将一个事件通知到各家各户,大家负责接收就行了。就
是源头到各个点的分散,有点像一对多的关系。
1. setListener(xxxListenr), 这种设计真是太普通了,大家也用的太多了,例如一个按钮的点击事件mButton.setOnClickListener
(new OnClickListener(){});还有就是接口回调,即数据源发生改变,通知到组件做相应的改变。
2. addListener(xxxListenr)与removeListener(xxxListener),例如:我们想做一个定位功能,定位功能在多个组件中都有用到,
如果定位发生改变,可以立即通知到各个组件,这很明显符合一对多的关系,即一次定位,多处改变,还可以得到省电的效果。作为
一个了解Android开发的程序员很快就会想到用广播(BroadcastReceiver)。这个很容易实现。因为笔者是不太喜欢用Android的
自定义广播。
public class CallBackManager {
private CallBackManager() {
}
//单例模式的回调管理
private static CallBackManager mInstance;
//所有的注册的回调接口集合
private LinkedList<OnLocationChangeListener> mCallBackListener;
public static CallBackManager getInstance() {
if (mInstance == null) {
mInstance = new CallBackManager();
}
return mInstance;
}
public void addListener(OnLocationChangeListener lister) {
if (mCallBackListener == null) {
mCallBackListener = new LinkedList<OnLocationChangeListener>();
}
mCallBackListener.remove(lister);
mCallBackListener.addFirst(lister);
}
//不需要的时候,清除接口
public void removeListener(OnLocationChangeListener lister) {
if (mCallBackListener != null) {
mCallBackListener.remove(lister);
}
}
public void stopCallback() {
if (mCallBackListener != null) {
mCallBackListener.clear();
mCallBackListener = null;
}
}
public void onChangeLocation(String lat,String lng) {
if (mCallBackListener != null) {
for (int i = 0; i < mCallBackListener.size(); i++) {
OnLocationChangeListener mListener =mCallBackListener.get(i);
if (mListener != null) {
mListener.changeLocation(lat,lng);
}
}
}
}
}
3. register(xxxListener)与unregister(xxxListener),总之与addListener(xxxListener)大同小异。
下篇详细介绍Eventbus实现的观察者模式。