淺析Windows Mobile Sensors API庫的設(shè)計
Windows Mobile 7正在開發(fā)過程中,相比較Android和iPhone的紅火,Windows Mobile似乎還是不溫不火。這里我們要談到的是Windows Mobile Sensors API庫的設(shè)計。
背景
熱烈歡迎 simon_new88 同學(xué)加入 Mobile Sensors API - Native unified APIs for Windows Mobile Sensors 項目。為了他更快熟悉,我把GSensor的設(shè)計記錄下來。關(guān)于該項目的一些信息可以參考 Windows Mobile下的重力感應(yīng)器(Gravitational Sensor)開發(fā) 和 Windows Mobile下使用CppUnitLite輸出測試結(jié)果。
簡介
本文講述Windows Mobile Sensors API庫中重力感應(yīng)器部分(GSensor)的設(shè)計。講述一個統(tǒng)一訪問接口的Sensor庫的設(shè)計方法和一些設(shè)計模式的應(yīng)用。
需求
統(tǒng)一訪問接口的Sensor庫(Native unified APIs for Windows Mobile Sensors)的需求:
1.統(tǒng)一的API訪問接口。由于為HTC和Samsung移動設(shè)備提供各自提供DLL來封裝Sensor,所以提供不一樣的訪問接口。使用Windows Mobile Sensors API庫,應(yīng)用開發(fā)人員在開發(fā)客戶端(Client)代碼時不需要知道具體設(shè)備的API,只是需要調(diào)用Windows Mobile Sensors API庫的統(tǒng)一接口就可以得到相應(yīng)的GSensor運行信息。
2.統(tǒng)一輸出GVector的單位。由于HTC和Samsung移動設(shè)備各自的GSensor庫輸出的GVector的單位是不一樣的,HTC輸出是-100到100的值,而Samsung又不一樣。所以Windows Mobile Sensors API庫需要把輸出值的單位進行統(tǒng)一。應(yīng)用開發(fā)人員在開發(fā)客戶端(Client)代碼時,一套代碼可以同時支持HTC和Samsung的移動設(shè)備。
設(shè)計
總體設(shè)計
GSensor部分的總體類圖設(shè)計:
下面文章分部分講述。
GSensor設(shè)計
GSensor是一個抽象類,定義了統(tǒng)一的訪問接口,主要提供三個主要的接口:
1.取GVector信息接口??蛻舳苏{(diào)用GetGVector()函數(shù)可以得到實時的GVector信息。
2.事件訂閱接口。當客戶端調(diào)用Register()訂閱GVector事件,通過Unregister()函數(shù)退訂該事件。事件的發(fā)送通過Observer模式實現(xiàn),后面講到。
3.單位調(diào)整接口。客戶端可以調(diào)用Scale()來調(diào)整想要的單位。
GetGVector(),Register()和Unregister()為純虛函數(shù)。表示GSensor指定的契約(contract),其繼承子類SamsungGSensor和HTCGSensor必須實現(xiàn)這些接口以厲行該契約。這兩個子類在實現(xiàn)這些接口時分別調(diào)用各自平臺相關(guān)的DLL來實現(xiàn)。
由于HTC的DLLHTCSensorSDK.dll沒有定時回調(diào)函數(shù)的實現(xiàn),所以在Windows Mobile Sensors API庫實現(xiàn)了一個ThreadTask類來定時查詢GVector的信息。ThreadTask類封裝了Start(),Stop()和ProcessTask()函數(shù),Start()負責產(chǎn)生一個線程,Stop()負責結(jié)束由Start()產(chǎn)生的線程,而ProcessTask()負責定期執(zhí)行任務(wù)。執(zhí)行任務(wù)的具體內(nèi)容在Process()中定義,Process()也是純虛函數(shù),也就是contract,由子類實現(xiàn)需要執(zhí)行的具體任務(wù),這里可以認為是Method Template模式的實現(xiàn)。HTCGSensor繼承了ThreadTask類,然后重載了Process()定時查詢GVector信息,然后通過調(diào)用GSensor的GVectorChanged()函數(shù)來通知Client。后面將講Observer模式,怎么GSensor怎么通知Client。
GSensorFactory的設(shè)計
這里使用了Simple Factory模式,客戶端只是需要調(diào)用GSensorFactory就可以取出GSensor的指針,GSensorFactory可以判斷設(shè)備類型取出SamsungGSensor或者HTCGSensor的實例。關(guān)于Simple Factory可以參考 我的實用設(shè)計模式之Simple Factory,Factory Method和Abstract Factory。
Observer的設(shè)計
從需求看,Windows Mobile Sensors API庫需要實現(xiàn)事件訂閱接口。當客戶端訂閱了消息時,客戶端會自動接收到GVector信息,這個功能是使用Observer模式實現(xiàn)的。關(guān)于Observer模式可以參考 我的實用設(shè)計模式之Observer模式。
我使用了一個開源的Observer模式實現(xiàn),和經(jīng)典的Observer的實現(xiàn)有點差異。但是目標是一致的,就是實現(xiàn)消息提供方和消息接收方的解耦。那個實現(xiàn)可以參考Experiences of Implementing the Observer Design Pattern (Part 3)。
Notifier是經(jīng)典Observer模型的Abstract Subject。GSensor是Concrete Subject繼承Notifier,通過調(diào)用notify()函數(shù)來通知Observers。Listener是經(jīng)典Observer模式的Abstract Observer。和經(jīng)典Observer模式有點不一樣。Notifier通過Event類來通知Listener。而Listener增加了一層繼承于GSensorListener。GSensorListener根據(jù)具體通知內(nèi)容而定義。這里通過C++的模板類來實現(xiàn)的。關(guān)于這方面的實現(xiàn)可以參考Template metaprogramming。
template <class interface_type> class Listener : public interface_type
SensorTesterView是Concrete Observer。需要實現(xiàn)GSensor_GVectorChanged()來處理通知消息。
Singleton的設(shè)計
SamsungGSensor和HTCGSensor分別設(shè)計為Singleton,因為不管有多少個消息訂閱者(Listener)都只有一個消息發(fā)送方。也就是一套系統(tǒng)里面只有一個SamsungGSensor或者HTCGSensor的實例。
關(guān)于Mobile Sensors API項目
這個項目還是在起步階段,當前實現(xiàn)了samsung的重力感應(yīng)器,我把項目host到 Mobile Sensors API - Native unified APIs for Windows Mobile Sensors 了,我會持續(xù)改進,把各種sensors的實現(xiàn)到這個項目中。
由于我手頭上沒有HTC的機器,如果誰有興趣可以加入到項目中幫我測試HTC設(shè)備,由于加入了Unit Test,測試變得很簡單,只需要執(zhí)行程序,參考測試輸出文件就可以了,不需要調(diào)試。當然這個測試過程是一個不斷迭代的過程,只是Unit Test把子過程簡單化了。
源代碼:http://mobilesensor.codeplex.com/SourceControl/ListDownloadableCommits.aspx
環(huán)境:VS2008 + WM 6 professional SDK + Samsung Windows Mobile SDK
【編輯推薦】