劉娜+劉如起
摘 要:根據Android應用開發語言Java的特點以及MVC模式的思想,提出一種基于注解的MVC模式,可用于Android應用的快速開發中,并根據Android跨進程應用的特點,提出一種解決方案,可使MVC模式用于跨進程應用中。
關鍵詞:Android;Java;MVC;注解;AIDL
DOI:10.16640/j.cnki.37-1222/t.2017.03.118
隨著搭載Android系統的智能設備的普及,對Android應用的需求也越來越大,需要一種好的設計模式提高開發的效率。MVC(模型-視圖-控制器)設計模式將數據和表現進行分離,既可以使數據以不同的形式表現,又可以方便的更換數據來源從而提高開發效率。由于Android系統以Java語言做為上層開發語言,本文基于MVC設計模式思想以及Java語言的特點,提出了一種基于注解的MVC開發框架,可大大簡化應用程序設計。又根據Android應用程序的特點,提出了一種針對跨進程應用使用該框架的方案,提高了框架的適用性。
1 MVC模式簡介
MVC設計模式是一種“分治”的思想,它將模型和視圖分離,從而使同一組數據可以使用不同的表現形式。MVC由三部分組成:模型(Model),視圖(View)及控制器。模型即數據來源,負責數據的生成及相關邏輯處理,視圖是模型的外在表現,一個模型可以對應一個或多個視圖。視圖是應用程序與外界輸入的接口。控制器是模型和視圖聯系的紐帶,一方面將外界輸入交給模型處理,另一方面又將模型處理好的數據交給視圖來表現,使模型和視圖同步更新。
在MVC設計模式中,三個層次作用清晰,各司其職,互不干涉,某一層的需求發生變化,只需要修改相應層而不會影響到其他層。同時分層設計也利于組件的重用和功能的擴展,可以很方便的用不同的視圖來顯示數據,從而使系統能輕松支持新的邏輯模塊和視圖顯示。因此,在開發中使用MVC設計模式具有顯著的優勢。
2 MVC模式的實現
使用觀察者模式來實現MVC框架。 實現步驟:
(1)定義抽象類Subjecter,持有觀察者類的對象。(2)定義抽象類IModel繼承Subjecter,作為模型的基類。(3)定義抽象類IView繼承Subjecter,作為視圖的基類。(4)定義抽象類IController,作為控制器,作為模型和視圖之間的紐帶,控制器類同時持有模型和視圖對象。(5)定義觀察者Observer,觀察者持有控制器對象。通過以上定義可以看到,模型和視圖持有觀察者對象,觀察者又持有控制器對象,而在控制器又同時持有模型和視圖對象。這樣一旦模型的數據發生變化就可以通知觀察者,觀察者使用控制器來通知視圖進行更新。而觀察者中的控制器和控制器中的視圖都是可以方便的更換,從而通過不同的控制器就實現了模型和視圖的分離,也就是MVC模式。
3 使用注解進行優化
建立了MVC模式之后,通過繼承IModel,IView,IController就可以使用MVC模式來進行開發了,但是在模型里面每多一種變化,相應的在控制器和視圖里面就要增加代碼來通知視圖和響應這種變化,從編程的角度來看這些響應過程其實就是調用視圖類相應的方法,在傳統的編程中需要先在視圖中定義方法,然后在控制器中調用。所以簡化的關鍵是實現動態調用方法。JAVA反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性。由于Java反射機制是基于方法名或變量名的字符串來實現的。可以使用字符串存儲視圖里面的方法名,然后控制器讀取字符串也就是方法名再通過反射來調用相應的方法。注解(Annotation),也叫元數據。可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,注釋。注解可以通過反射來獲取。這樣就可以把模型的變化定義為一個字符串類型的動作,給視圖的相應方法加上以這個動作為值的注解,然后在控制器里面讀取相應的注解,從而使模型的變化與視圖的響應方法自動的對應起來,這樣就減少了代碼量,更易于使用。
基于上面的思路,首先定義注解:
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface MVCAction {
String value() default "";
}
注解設定為可以使用在方法上,并且在運行時存在。
接下來的關鍵就是解析注解,在IView里面編寫一個注解解析器,并將解析到的動作名與被該動作所注解的方法的名字一一對應保存在列表中,這樣當模型數據發生變化就通過控制器向視圖發送動作,在控制里面通過動作得到視圖里面的方法名進而通過反射得到對應方法。從而簡化了模型,視圖及控制器類的定義,通過盡可能的重用代碼減小了代碼的復雜度,從而達到快速開發的效果。
4 在Android中應用
在很多Android應用場景中,一個完整的應用是由客戶端與服務來實現的,這樣就可以把客戶端當作視圖,服務當作模型來使用MVC架構了。但是有很多應用的客戶端與服務要運行在不同的進程里面,不能直接使用傳統的MVC框架。這時可以把模型分成兩部分:客戶端的本地模型和服務端的遠程模型,本地模型作為遠程模型的代理與視圖和控制器組成MVC架構。同時本地模型和遠程模型通過AIDL接口進行通訊:遠程模型把將方法信息和打包后的參數傳遞給本地模型。(1) 對參數統一化:把任意數量,任意類型的參數打包并實現Parcelable接口以通過AIDL進行傳遞。(2) 通過AIDL和遠程回調實現遠程模型和本地模型通訊。這樣通過封裝的接口和遠程回調就可以對用戶隱藏本地模型和遠程模型之間的聯系,從而可以像本地通訊一樣在跨進程的應用中使用MVC架構。
5 總結
本文通過觀察者模式實現了一個輕量級的MVC框架,并通過反射和注解對框架中的核心部分進行了優化,從而方便使用。并結合Android系統的應用環境進行分析并擴展從而能方便的使用MVC框架。通過在Android應用中使用MVC模式可以使應用結構清晰,可以視圖層和模型層分別開發,二者的交互交給MVC框架來完成。同時便于后期維護,在模型層不變的情況下可以任意的更換視圖層從而達到快速開發的效果。
參考文獻:
[1]閆術卓,楊強.Struts2技術詳解:基于WebWork核心的MVC開發與實踐[M].電子工業出版社,2008.
[2]李春紅,高建華.使用分層模型改進MVC設計架構[J].計算機工程與設計,2007(04).
[3]陳云芳.精通Struts2:基于MVC的JavaWeb應用開發實戰[M].人民郵電出版社,2008.
[4]冉春玉,白炳杉.MVC模式及struts框架應用研究[J].武漢理工大學學報.
[5]Bruce Eckel .Thinking in java(java編程思想)第四版[M].北京:機械工業出版社,2011.
[6]劉衛國,姚昱禹.Android的架構與應用開發研究[J].中南大學:信息科學與工程學院計算機系統應用,2008(11):110-112.