標籤:測試 結束 輸入 image 編程 相容 載入 基本 文章
在上一篇文章中,我們將 View 類單獨出來並完成了設計和編寫。這次我們將完成 Model 類,並通過 Controller 將兩者串連起來,完成這個計算機程式。
模型(Model)就是程式中封裝了資料,並定義了操作和處理這些資料的邏輯的對象。在計算機的例子中,就是處理輸入的運算元和運算子,並計算返回結果。Let’s Go
(注意:樣本中直接使用 double 類型來處理資料,但嚴格來說很多語言的浮點數計算都是不精確的)
一,設計模型的介面
在程式構建之初,我們首先考慮的應該是各模組間的封裝和擴充,設計好模組的介面,然後再實現模組的細節,最後把模組組合起來構成整個程式。這就是面向介面編程的概念。
思考一下 Model 類,它主要實現三個功能,1,接受運算元輸入;2,接受運算子輸入並返回計算結果;3,重設。這些功能主要都是被外部使用的,所以基於此來設計介面,對其它類而言,只需知道該介面定義了什麼方法然後使用就行,而不需要瞭解實現細節。
建立 com.test.interfaces 包,並右鍵選擇 New -> Interface 建立一個名為 ICalculator 的介面(一般介面命名都以大寫字母 I 開頭)
建立 com.test.model 包,並建立 CalModel 類,同時實現 ICalculator 介面。
二,通過棧和遞迴函式實現計算機演算法
計算機的計算規則很簡單,從左至右計算,不考慮運算子的優先順序,例如:2 + 1 * 2 - 3,相當於: (((2 + 1) * 2) - 3) = 3;這樣保證編寫的簡易性。
我們知道,棧是一種後進先出的資料結構,我們通過一個棧 dataStack 記錄輸入的運算數和操作符。:
所謂的遞迴函式,就是接受有限的自然數,通過重複調用自身,最終得到一個自然數結果的函數。演算法的核心就是設計這樣一個遞迴函式 popOpOffStack 來對 dataStack 進行求解,過程
三,編寫程式
按上面的思路,popOpOffStack 可以單獨寫出,並不需要執行個體化後才能使用,所以將 popOpOffStack 設為 CalModel 的靜態方法則可,
完成編寫後,可以構建一個棧來測試一下,因為返回的是 double 類型,所以結果是 3.0,
核心演算法完成後,完成對運算數和操作符的輸入的處理並補充其它細節。這樣我們的 CalModel 就完成了。
四,通過Controller將Model和View串連
在 Android 的文檔中,Activity 是被推薦作為 Controller 的角色,負責視圖和模型的協調、溝通。而從 Activity 所擁有的功能的角度看,也是最合適的選擇。至此,代碼結構也清晰了。MainActivity 將作為 Controller 協調視圖和模型,並對一些資料及細節進行處理。其代碼如下:
通過 MainActivity 將模型和視圖串連起來後,我們的計算機也最終完成了。可以運行測試一下。
五,結束及回答
本次要點:
1)通過 MVC 設計,使計算機程式有了較好的擴充和維護能力,假如使用另一種計算機演算法,只需建立另一實現 ICalculator 介面的 Model 類,並代替原來的 CalMode 則可。當需要增加功能時,可以將代碼增加到對應的模組處而不用隨意寫在一起。
2)這次只介紹了最基本的 MVC 知識,而至於 MVC 模式更進階的使用以及模組間的通訊會在後面再講。從代碼的編寫中,大家可能會發現 MainActivity 其實很難進行抽象,因為都是一些串連的邏輯和細碎代碼。這也就是為什麼 MVC 概念提出這麼久以來,Model 和 View 的封裝技術有了長足進步,而 Controller 卻沒什麼突破的原因之一。作為前端,這方面大家可以對比一下現時流行起來的 MVC 庫,對 Controller 角色的處理。而蘋果在 Cocoa 中對 Controller 的封裝也是很有特色,有機會會介紹對比一下。
3)例子中的細節處理還可以處理得更好,就留給大家修改。另外,有時間的話可以嘗試使用經典的雙棧演算法來實現這個計算機,替換 CalModel 類。
在上幾篇文章中大家提到的問題在這裡總結回答一下:
1)什麼時候用回調和 MVC 的設計為什麼可以提高維護和擴充性:對於前者,當我們設計一個模組時,模組除提供方法外,自身發生的事是需要被外界瞭解時,或外界對這個模組發生的事是“渴望”得知的,這個時候就需要進行回調處理了。對於後者,在這次的文章中講得比也較清晰了。
2)建立工程時,為什麼會多出一些 support-v4、 support-v7 等這些包,這是 Android 的一些進階 API 或組件為在低版本中向下相容實現而自動載入到工程中的,對自身程式並沒有什麼影響。
Android:MVC模式(下)