Android 設計模式之MVC模式


  說到Android設計模式的MVC模式,估計很多人都是比較熟悉了,這里深入了解一下MVC到底是怎么回事,以ListView為例子講解。

一、深入理解MVC概念

  MVC即Model-View-Controller。M:邏輯模型,V:視圖模型,C:控制器。

  MVC模式下,系統框架的類庫被划分為3種:模型(Model)、視圖(View)、控制器(Controller)。模型對象負責建立數據結構和相應的行為操作處理。視圖對象負責在屏幕上渲染出相應的圖形信息展示給用戶看。控制器對象負責截獲用戶的按鍵和屏幕觸摸等事件,協調Model對象和View對象。

  用戶與視圖交互,視圖接收並反饋用戶的動作;視圖把用戶的請求傳給相應的控制器,由控制器決定調用哪個模型,然后由模型調用相應的業務邏輯對用戶請求進行加工處理,如果需要返回數據,模型會把相應的數據返回給控制器,由控制器調用相應的視圖,最終由視圖格式化和渲染返回的數據,對於返回的數據完全可以增加用戶體驗效果展現給用戶。

  一個模型可以有多個視圖,一個視圖可以有多個控制器,一個控制器也可以有多個模型。

(1)、模型(Model)

  Model是一個應用系統的核心部分,代表了該系統實際要實現的所有功能處理。比如:在視頻播放器中,模型代表一個視頻數據庫及播放視頻的程序函數代碼;在拍照應用中,模型代表一個照片數據庫,及看圖片時的程序函數代碼。在一個電話應用中,Model代表一個電話號碼簿,以及撥打電話和發送短信的程序函數代碼。

  Model在values目錄下通過xml文件格式生成,也可以通過硬編碼的方式直接Java代碼生成。View和Model是通過橋梁Adapter來連接起來。

(2)、視圖(View)

  View是軟件應用傳送給用戶的一個反饋結果。它代表軟件應用中的圖形展示、聲音播放、觸覺反饋等職責。視圖的根節點是應用程序的自身窗口。比如,視頻播放器中可能包含當前播放的畫面,這個畫面就是一個視圖。另一個視圖組件可能是該視頻的文字標題。再一個就是一些播放按鍵,比如:Stop、Start、Pause等按鈕。

  View在layout目錄下通過xml文件格式生成,用findViewById()獲取;也可以通過硬編碼的方式直接Java代碼生成。

(3)、控制器(Controller)

  Controller在軟件應用負責對外部事件的響應,包括:鍵盤敲擊、屏幕觸摸、電話呼入等。Controller實現了一個事件隊列,每一個外部事件均在事件隊列中被唯一標識。框架依次將事件從隊列中移出並派發出去。

二、MVC典型例子的實現ListView

  Android中最典型MVC是ListView,要顯示的數據是Model,界面中的ListView是View,控制數據怎樣在ListView中顯示是Controller。

(1)、通過硬編碼的方式直接Java代碼生成方式,這里直接在注釋講解

public class ArrayAdapterActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//界面中的ListView是View,這里通過硬編碼的方式直接Java代碼生成
		ListView listView = new ListView(this);
		// 控制數據怎樣在ListView中顯示是Controller
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, getData());
		//View和Model是通過橋梁Adapter來連接起來。
		listView.setAdapter(adapter);
		setContentView(listView);
		// 點擊事件,Controller負責
		listView.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				// position是從0開始的,獲取點擊item的內容
				Toast.makeText(ArrayAdapterActivity.this, getData().get(position), Toast.LENGTH_SHORT).show();
			}
		});
	}
	// 要顯示的數據Model,通過硬編碼的方式直接Java代碼生成
	private List<String> getData() {
		List<String> data = new ArrayList<String>();
		data.add("a");
		data.add("b");
		data.add("c");
		data.add("d");
		return data;
	}
}

 (2)、視圖View和模型Model取資源文件方式

  先在res/layout文件夾下創建文件activity_arrayadapter.xml,可以看出只包含一個ListView,即視圖View

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:drawSelectorOnTop="false" />
</LinearLayout>

  在res/values文件夾下的strings.xml添加一個字符數組,及模型Model

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="good">
         	<item>a</item>
          	<item>b</item>
          	<item>c</item>
          	<item>d</item>
    </string-array>
</resources>

  Activity代碼,在注釋中講解MVC模型使用

public class ArrayAdapterActivity2 extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_arrayadapter);
		//界面中的ListView是View,View在layout目錄下通過xml文件格式生成,用findViewById()獲取
		ListView listView = (ListView) findViewById(R.id.listview);
		// 控制數據怎樣在ListView中顯示是Controller
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, getData());
		//View和Model是通過橋梁Adapter來連接起來。
		listView.setAdapter(adapter);
		// 點擊事件,Controller負責
		listView.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				// position是從0開始的,獲取點擊item的內容
				Toast.makeText(ArrayAdapterActivity2.this, getData().get(position), Toast.LENGTH_SHORT).show();
			}
		});
	}
	// 要顯示的數據Model,Model在values目錄下通過xml文件格式生成
	private List<String> getData() {
		List<String> data = new ArrayList<String>();
		Resources res =getResources();
		// 取xml文件格式的字符數組
		String[] good=res.getStringArray(R.array.good);
		for(int i=0;i<good.length;i++){
			data.add(good[i]);
		}
		return data;
	}
}

  Android的MVC模式要在項目中慢慢理解,這樣才能理解透徹並活學活用。

  到這里基本介紹完了Android設計模式之MVC模型,若本文對您有幫助請點“推薦”支持,若有什么錯誤請指正留言,共同探討。

  轉載請附上本文鏈接:http://www.cnblogs.com/liqw/p/4175325.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM