观察者模式是什么

  什么是观察者模式了?百度一搜,讲了一大推理论,貌似还很有道理,不过对于一个程序员来说,理论终究要去实践了。直接举几个代码例子: 
   
 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 mCallBackListener;

    public static CallBackManager getInstance() {
        if (mInstance == null) {
            mInstance = new CallBackManager();
        }
        return mInstance;
    }

    public void addListener(OnLocationChangeListener lister) {
        if (mCallBackListener == null) {
            mCallBackListener = new LinkedList();
        }
        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实现的观察者模式。

你可能感兴趣的:(观察者模式是什么)