1.观察者模式的定义
观察者模式定义一种一对多的关系,使得没当一个被观察的对线发生变化,所有监听的对象都会收到通知。
2.观察者模式的UML图
3.观察着模式的例子
接下来举一个在Android中使用观察者模式的一个典型案例------>网络变换通知模型
首先定义抽象观察者
NetWorkObserver
,这里使用接口
public interface NetWorkObserver {
public void notifyNetStataChange(int state);
}
然后定义具体的主题subject也就是被观察者NetWorkManager,这里结合单例模式
首先是组册观察者的方法:
public void registerNetWorkStateChangeListener(NetWorkObserver observer){ if (observers.contains(observer)) { return; } observers.add(observer); }
然后是反注册观察者的方法public void unRegisterNetWorkStateChangeListener(NetWorkObserver observer){ if (observers.contains(observer)) { observers.remove(observer); } }
最后是发送通知的方法public void notifyNetWorkStateChange(int state){ for (NetWorkObserver observer : observers) { observer.notifyNetStataChange(state); } }
整个NetWorkManager的代码如下:
public class NetWorkManager { private static NetWorkManager mInstance = new NetWorkManager(); private static ArrayList<NetWorkObserver> observers = new ArrayList<NetWorkObserver>(); public static NetWorkManager getInstance(){ return mInstance; } public void registerNetWorkStateChangeListener(NetWorkObserver observer){ if (observers.contains(observer)) { return; } observers.add(observer); } public void unRegisterNetWorkStateChangeListener(NetWorkObserver observer){ if (observers.contains(observer)) { observers.remove(observer); } } public void unRegisterAllNetWorkStateChangeListener(){ observers.clear(); } public void notifyNetWorkStateChange(int state){ for (NetWorkObserver observer : observers) { observer.notifyNetStataChange(state); } } }
好了,整个观察者模式已经完成了,然后在监听网络变化的广播接收者里面调用这个notifyNetWorkStateChange方法
public class NetWorkStateChangeReciver extends BroadcastReceiver { private final String NET_CONN_CONNECTIVITY_CHANGE = "android.net.conn.CONNECTIVITY_CHANGE"; private final int NET_NO_CONNECT = 0; private final int NET_WIFI_CONNECT = 1; private final int NET_MOBILE_CONNECT = 2; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (NET_CONN_CONNECTIVITY_CHANGE.equals(action)) { ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = conMgr.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isAvailable()) { int type = networkInfo.getType(); if (type == ConnectivityManager.TYPE_WIFI) { NetWorkManager.getInstance().notifyNetWorkStateChange(NET_WIFI_CONNECT); } else if (type == ConnectivityManager.TYPE_MOBILE) { NetWorkManager.getInstance().notifyNetWorkStateChange(NET_MOBILE_CONNECT); } } else { NetWorkManager.getInstance().notifyNetWorkStateChange(NET_NO_CONNECT); } } } }
这样,所有的观察者在网络发生变化的时候都会接收到通知。4.Android 中观察者模式应用android 中的广播就是一个观察者模式,能够轻易的完成跨进程和跨进程的通信。5.总结观察者模式适用于 当一个对象的改变需要给变其它对象时,而且它不知道具体有多少个对象有待改变时情景,降低模块之间的耦合。