Android框架模式——MVC

1. MVC介紹

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫毙驯,是一種框架模式倒堕。

Model:模型層,負責(zé)處理數(shù)據(jù)的加載或存儲爆价。
View:視圖層垦巴,負責(zé)界面數(shù)據(jù)的展示,與用戶進行交互铭段。
Controller:控制器層骤宣,負責(zé)邏輯業(yè)務(wù)的處理。

1.1 作用

將業(yè)務(wù)邏輯序愚、數(shù)據(jù)憔披、界面分離的一種代碼組織方式,修改界面時無需去修改業(yè)務(wù)邏輯爸吮。

1.2 流程

MVC.png

1.View接受用戶的請求芬膝,然后將請求傳遞給Controller。
2.Controller進行業(yè)務(wù)邏輯處理后形娇,通知Model去更新锰霜。
3.Model數(shù)據(jù)更新后,通知View去更新界面顯示桐早。

1.3 關(guān)系

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

2. MVC例子實現(xiàn)

Android中一般布局的XML文件就是View層所灸,Activity則充當(dāng)了Controller的角色。

下面舉個簡單的例子來實現(xiàn)炫七,點擊按鈕對數(shù)字+1然后重新顯示出來。

2.1 Model層

創(chuàng)建一個數(shù)據(jù)模型钾唬,能夠保存一個數(shù)字万哪,并有一個更新的方法,數(shù)據(jù)更新完后會通知UI去更改顯示的內(nèi)容抡秆。

public class NumModel {
    private int num = 0;

    public void add(ControllerActivity activity) {
        num = ++num;//更新數(shù)據(jù)
        activity.updateUI(num + "");//更新UI
    }

}

2.2 View層

View層在Android中對應(yīng)的就是布局的XML文件奕巍。
activity_controller.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"/>

    <Button
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="點擊+1"/>
</LinearLayout>

2.3 Controller層

Android中一般由Activity來充當(dāng)Controller。Controller一方面接收來自View的事件儒士,一方面通知Model處理數(shù)據(jù)的止。

public class ControllerActivity extends Activity {

    private TextView mTextView;
    private Button mButton;
    private NumModel mNumModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_controller);

        mTextView = findViewById(R.id.tv_show);
        mButton = findViewById(R.id.btn_add);
        mNumModel = new NumModel();
        
        mButton.setOnClickListener(new View.OnClickListener() {//接收來自View的事件
            @Override
            public void onClick(View v) {
                mNumModel.add(ControllerActivity.this);//通知Model處理數(shù)據(jù)
            }
        });
    }

    public void updateUI(String text) {//更新UI
        mTextView.setText(text);
    }
}

3. Android中的源碼應(yīng)用

Android中最典型的MVC莫過于ListView了,要顯示的數(shù)據(jù)為Model着撩,而要顯示的ListView就是View了诅福,Adapter則充當(dāng)著Controller的角色匾委。當(dāng)Model發(fā)生改變的時候可以通過調(diào)用AdapternotifyDataSetChanged方法來通知組件數(shù)據(jù)發(fā)生變化,這時Adapter會調(diào)用getView方法重新顯示內(nèi)容氓润。具體代碼這里就不分析了赂乐。

4. MVC的優(yōu)點

  • 視圖層(View)與模型層(Model)解偶,通過Controller來進行聯(lián)系咖气。
  • 模塊職責(zé)劃分明確挨措。主要劃分層M,V,C三個模塊,利于代碼的維護崩溪。

5. MVC的缺點

  • Android中使用了Activity來充當(dāng)Controller浅役,但實際上一些UI也是由Activity來控制的,比如進度條等伶唯。因此部分視圖就會跟Controller捆綁在同一個類了觉既。同時,由于Activity的職責(zé)過大抵怎,Activity類的代碼也會迅速膨脹奋救。
  • MVC還有一個重要的缺陷就是View跟Model是有交互的,沒有做到完全的分離反惕,這就會產(chǎn)生耦合尝艘。

6.其他

雖然MVC很簡單,但是如果項目比較小且無需頻繁修改的話姿染,就可以不用MVC了背亥,避免過度設(shè)計,造成維護困難悬赏。
鑒于MVC的缺點狡汉,誕生了MVP來解決這些問題,下一篇文章繼續(xù)來說明~

相關(guān)文章閱讀
Android框架模式——MVC
Android框架模式——MVP
Android框架模式——MVVM

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闽颇,一起剝皮案震驚了整個濱河市盾戴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兵多,老刑警劉巖尖啡,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剩膘,居然都是意外死亡衅斩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門怠褐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畏梆,“玉大人,你說我怎么就攤上這事〉煊浚” “怎么了宪巨?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铣猩。 經(jīng)常有香客問我揖铜,道長,這世上最難降的妖魔是什么达皿? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任天吓,我火速辦了婚禮,結(jié)果婚禮上峦椰,老公的妹妹穿的比我還像新娘龄寞。我一直安慰自己,他們只是感情好汤功,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布物邑。 她就那樣靜靜地躺著,像睡著了一般滔金。 火紅的嫁衣襯著肌膚如雪色解。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天餐茵,我揣著相機與錄音科阎,去河邊找鬼。 笑死忿族,一個胖子當(dāng)著我的面吹牛锣笨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播道批,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼错英,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了隆豹?” 一聲冷哼從身側(cè)響起椭岩,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎璃赡,沒想到半個月后簿煌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡鉴吹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惩琉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豆励。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出良蒸,到底是詐尸還是另有隱情技扼,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布嫩痰,位于F島的核電站剿吻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏串纺。R本人自食惡果不足惜丽旅,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纺棺。 院中可真熱鬧榄笙,春花似錦、人聲如沸祷蝌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巨朦。三九已至米丘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間糊啡,已是汗流浹背拄查。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悔橄,地道東北人靶累。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像癣疟,于是被迫代替她去往敵國和親挣柬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容