标签:android观察者模式 java
在阎宏博士的《JAVA与模式》一书中开头是这样描述观察者(Observer)模式的:同样,一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其他的对象做出相应的改变。做到这一点的设计方案有很多,但是为了使系统能够易于复用,应该选择低耦合度的设计方案。减少对象之间的耦合有利于系统的复用,但是同时设计师需要使这些低耦合度的对象之间能够维持行动的协调一致,保证高度的协作。观察者模式是满足这一要求的各种设计方案中最重要的一种。(上文源于网络)
上图是观察者模式的基本模型,以通话状态(CallState)为例,来分析手机通话状态变化时,是怎么传递这个事件的。
RegistrantList作为通知者,Registrant为观察者,RegistrantList通知者提供了add、remove、notifyRegistrants来管理Registrant。
1、通话状态是怎么被监听的?
mCallStateRegistrants是RegistrantList的一个对象,在BaseCommand.java中生成,并对RegistrantList通知者的添加、删除做了封装:
protected RegistrantList mCallStateRegistrants = new RegistrantList();
public void registerForCallStateChanged(Handler h, int what, Object obj) { Registrant r = new Registrant (h, what, obj);//观察者 mCallStateRegistrants.add(r); } public void unregisterForCallStateChanged(Handler h) { mCallStateRegistrants.remove(h); }
public synchronized void add(Registrant r) { removeCleared(); registrants.add(r); }registrants是一个 ArrayList对象,管理Registrant其实就是对 ArrayList的操作。
registerForCallStateChanged是在GsmCallTracker.java的构造函数被调用的:
mCi.registerForCallStateChanged(this, EVENT_CALL_STATE_CHANGE, null);this就是GsmCallTracker本身,GsmCallTracker继承了Handler,此处,也就是说GsmCallTracker成为了观察者,当CallState变化时mCallStateRegistrants应该通知GsmCallTracker。
mCi.unregisterForCallStateChanged(this);
case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: if (RILJ_LOGD) unsljLog(response); mCallStateRegistrants .notifyRegistrants(new AsyncResult(null, null, null)); break;
public /*synchronized*/ void notifyResult(Object result) { internalNotifyRegistrants (result, null); } private synchronized void internalNotifyRegistrants (Object result, Throwable exception) { for (int i = 0, s = registrants.size(); i < s ; i++) { Registrant r = (Registrant) registrants.get(i); r.internalNotifyRegistrant(result, exception); } }
3、观察者Registrant是怎么响应处理通知的?
上面看到r.internalNotifyRegistrant(result, exception),观察者知道callstate发生变化后,谁来真正处理?
Registrant部分代码:
internalNotifyRegistrant (Object result, Throwable exception) { Handler h = getHandler(); if (h == null) { clear(); /// M: Registrant Debug Log Enhancement Log.d("Registrant", "internalNotifyRegistrant(): Warning! Handler is null, it could be already GCed. ( what=" + what + ", userObj=" + userObj + ", result=" + result + ", exception=" + exception + " )"); } else { Message msg = Message.obtain(); msg.what = what; msg.obj = new AsyncResult(userObj, result, exception); h.sendMessage(msg); } }Handler h = getHandler();获得的Handler就是上文说到的this,也就是GsmCallTracker,what就是registerForCallStateChanged注册时的第二个参数EVENT_CALL_STATE_CHANGE,这里h.sendMessage也就是用的GsmCallTracker这个Handler发送的消息。我们都知道,Handler发送的消息都会被它自己的handleMessage()方法所接收处理。
于是,我们在GsmCallTracker的handleMessage()方法中看到:
case EVENT_CALL_STATE_CHANGE: pollCallsWhenSafe(); break;具体做什么操作,我们就不管了。。。
未完待续,有不对的地方,请指正。
标签:android观察者模式 java
原文地址:http://blog.csdn.net/canghai1129/article/details/40897673