浅析观察者模式

来源:互联网 发布:软件管家官方下载安装 编辑:程序博客网 时间:2024/06/10 02:54
  什么是观察者模式了?百度一搜,讲了一大推理论,貌似还很有道理,不过对于一个程序员来说,理论终究要去实践了。直接举几个代码例子:  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实现的观察者模式。
0 0