Android 之 观察者模式

来源:互联网 发布:淘宝主图最好是多少kb 编辑:程序博客网 时间:2024/04/29 16:06
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.总结
观察者模式适用于当一个对象的改变需要给变其它对象时,而且它不知道具体有多少个对象有待改变时情景,降低模块之间的耦合。




1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 两岁宝宝不愿意喝奶粉怎么办 吃母乳不愿意吃奶粉怎么办 母乳宝宝不愿意喝奶粉怎么办 宝宝断母乳不喝奶粉怎么办 9个月宝宝不会爬怎么办 孩子五年级学习成绩差该怎么办 孩子临近中考学习成绩很差该怎么办 初中生成绩不好家长该怎么办 成绩差该怎么办贴吧 宝宝只会匍匐爬怎么办 一年级的孩子数学不好怎么办 小学一年级孩子数学不好怎么办 孩子上一年级数学太差怎么办 智商低情商也低怎么办? 孩子字写得很大怎么办 孩子拿笔重 写字太黑 怎么办 孩子语文成绩好数学不行怎么办? 孩子现在二年级特别叛逆怎么办 孩子又笨又蠢怎么办 四年级孩子数学计算能力差怎么办 孩子四年级数学理解能力差怎么办 孩子小学四年级数学很差怎么办 孩子做作业太慢怎么办 小学三年级数学成绩差怎么办 初一数学考了3分怎么办 初二物理太差该怎么办 三年级孩子字写的差怎么办 小学三年级数学才考86怎么办 小孩子一发脾气就打妈妈怎么办 孩子做错事不肯道歉怎么办 小孩写作业注意力不集中怎么办 六年级的数学下册差怎么办 一年级小孩做作业慢怎么办 静不下心写作业怎么办 二年级应用题太差怎么办 小学二年级数学差怎么办 小学二年级成绩差怎么办 6个月小孩爱动怎么办 儿子叛逆期我该怎么办 宝宝两岁好动不听话怎么办 生宝宝后奶水少怎么办