5分鐘搭建MVP項(xiàng)目

轉(zhuǎn)載請(qǐng)注明版權(quán)


寫在前面


? ? ? ?接到公司的需求,把之前那個(gè)實(shí)在維護(hù)不動(dòng)的項(xiàng)目重構(gòu)一下(之前項(xiàng)目是eclipse+沒有架構(gòu)寫的韵卤,跟平鋪差不多),臨時(shí)組建了4個(gè)人的Android開發(fā)小組,確定架構(gòu)的時(shí)候全票通過了MVP。
? ? ? ?之前雖然用過MVP刁笙,可總意會(huì)不到MVP的精髓所在,反而經(jīng)常被繞暈谦趣。也看了很多關(guān)于MVP的技術(shù)博客疲吸。怎么寫的都有,很多分不清M層和P層的職責(zé)所在前鹅,為了發(fā)揮MVP的優(yōu)勢(shì)摘悴,特地找到了Google官方發(fā)布的MVP源碼〗⒒妫總算發(fā)現(xiàn)了新大陸蹂喻。(本文不會(huì)講解官方的源碼,只針對(duì)個(gè)人理解進(jìn)行敘述捂寿,大神至此請(qǐng)無視)


啥是MVP


? ? ? ?Model View Presenter俗稱MVP口四,該架構(gòu)是從著名的MVC架構(gòu)演變而來的。
? ? ? ?Android應(yīng)用開發(fā)類似MVC架構(gòu)秦陋。開發(fā)中將XML文件視為MVC中的View角色蔓彩,將Activity則視為MVC中的Controller角色。但是在實(shí)際應(yīng)用開發(fā)中Activity大多充當(dāng)Controller和View的合體驳概。于是Activity既要負(fù)責(zé)視圖的顯示赤嚼,又要負(fù)責(zé)對(duì)業(yè)務(wù)邏輯的處理。使得Activity過于臃腫顺又。為了優(yōu)化這一情況特地提出MVP架構(gòu)模式更卒,使得每層各盡其職,條理清晰稚照。

用一張圖來描述下他們之間的關(guān)系

image

M:邏輯層逞壁,數(shù)據(jù)邏輯流济,網(wǎng)絡(luò)邏輯全寫在這
P:調(diào)度層,M層和V層的交互需要P層調(diào)度
V:UI層腌闯,一般指Activity Fragement等等ui界面


咋用的MVP绳瘟?


? ? ? ?在實(shí)際的使用使用中,我采用了Google官方的那種寫法姿骏,除了MVP三層以外還增加了一個(gè)Contract契約類,將邏輯接口以及UI接口全部寫在了Contract契約類中糖声。然后Presenter和View分別實(shí)現(xiàn)Contract類中各自的接口。這么做的目的是方便管理分瘦,提高代碼的可讀性蘸泻。打開Contract后一目了然,能非常清晰快速的了解到本模塊的所有邏輯結(jié)構(gòu)嘲玫。

說了半天到底怎么個(gè)意思悦施?

我叫啥意思.png

我們還是擼下代碼吧,還是擼代碼來的實(shí)在一點(diǎn)去团,首先我們看一張類結(jié)構(gòu)圖

類結(jié)構(gòu)圖.png

? ? ? ?BaseViewBasePresenter兩個(gè)類抡诞,命名上就能看出這倆類是V層與P層的基類,主要實(shí)現(xiàn)所有View和Presenter都需要使用的接口土陪。
? ? ? ?MainContract:該類為契約類昼汗,集成了View層的ui更新接口以及Presenter層調(diào)用邏輯接口。

public class MainContract {
    interface View extends BaseView<Presenter> {
        void showView(String data);
    }
    interface Presenter extends BasePresenter {
        void loadData(int condition);
    }
}

? ? ? ?MainModel:該類為M層的邏輯處理類鬼雀,所有的邏輯處理以及聯(lián)網(wǎng)等均在此類中進(jìn)行顷窒,最后通過P層調(diào)用從而實(shí)現(xiàn)邏輯驅(qū)動(dòng)。


public class MainModel {
    /**
     * 處理邏輯
     *
     * @param condition 處理?xiàng)l件
     * @return 處理結(jié)果
     */
    public String getData(int condition) {
        switch (condition) {
            case 1: {
                return "處理結(jié)果為1";
            }
            case 2: {
                return "聯(lián)網(wǎng)處理結(jié)果為2";
            }
            default: {

            }
            break;
        }
        return "處理結(jié)果為:沒找到處理?xiàng)l件";
    }
}

? ? ? ?MainActivity:該類為V層的UI處理類源哩,實(shí)現(xiàn)MainContract.View接口鞋吉。主要負(fù)責(zé)Presenter,Model的初始化励烦,以及UI的更新操作坯辩。

public class MainActivity extends AppCompatActivity implements MainContract.View {
    MainContract.Presenter mPresenter;
    TextView tv;
    Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);
        btn = (Button) findViewById(R.id.btn);
        //Model和Presenter初始化
        new MainPresenter(new MainModel(), this);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mPresenter.loadData(1);
            }
        });
    }
    @Override
    public void setPresenter(MainContract.Presenter presenter) {、
        //獲取Presenter
        this.mPresenter = presenter;
    }
    @Override
    public void showView(String data) {
         //更新UI
        tv.setText(data);
    }
}

? ? ? ?MainPresenter:該類為P層的調(diào)度處理類崩侠,主要負(fù)責(zé)調(diào)用View層以及Model層的方法或接口以實(shí)現(xiàn)調(diào)度的職責(zé)漆魔。該類構(gòu)造函數(shù)中接收Activity初始化好的Model和View,并通過View設(shè)置Presenter使得每一個(gè)實(shí)現(xiàn)MainContract.View接口的View均可得到Presenter對(duì)象却音,以方便后續(xù)操作改抡。

public class MainPresenter implements MainContract.Presenter {
    MainModel mMainModel;
    MainContract.View mView;

    public MainPresenter(@NonNull MainModel mainModel, @NonNull MainContract.View view) {
        this.mMainModel = mainModel;
        this.mView = view;
        mView.setPresenter(this);
    }
    @Override
    public void loadData(int condition) {
        //調(diào)用過程
        mView.showView(mMainModel.getData(condition));
    }
}

? ? ? ?至此,完整的MVP架構(gòu)已經(jīng)敘述完畢了系瓢,通過以上的描述我們可以清楚的了解到MVP目前比較火的架構(gòu)之一阿纤。他能最大程度的降低代碼耦合程度以及維護(hù)成本,提高代碼的維護(hù)性和可讀性夷陋。從而達(dá)到以不變應(yīng)萬變的目的欠拾。

以上是本人對(duì)MVP的全部理解胰锌。如果疑問和建議歡迎留言指點(diǎn)。

最后附上GitHub地址:

https://github.com/w525721508/MyApplication.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藐窄,一起剝皮案震驚了整個(gè)濱河市资昧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荆忍,老刑警劉巖格带,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刹枉,居然都是意外死亡叽唱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門微宝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棺亭,“玉大人,你說我怎么就攤上這事蟋软∠庹” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵钟鸵,是天一觀的道長。 經(jīng)常有香客問我涤躲,道長棺耍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任种樱,我火速辦了婚禮蒙袍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嫩挤。我一直安慰自己害幅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布岂昭。 她就那樣靜靜地躺著以现,像睡著了一般。 火紅的嫁衣襯著肌膚如雪约啊。 梳的紋絲不亂的頭發(fā)上邑遏,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音恰矩,去河邊找鬼记盒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛外傅,可吹牛的內(nèi)容都是我干的纪吮。 我是一名探鬼主播俩檬,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼碾盟!你這毒婦竟也來了棚辽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤巷疼,失蹤者是張志新(化名)和其女友劉穎晚胡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚼沿,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡估盘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了骡尽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遣妥。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖攀细,靈堂內(nèi)的尸體忽然破棺而出箫踩,到底是詐尸還是另有隱情,我是刑警寧澤谭贪,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布境钟,位于F島的核電站,受9級(jí)特大地震影響俭识,放射性物質(zhì)發(fā)生泄漏慨削。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一套媚、第九天 我趴在偏房一處隱蔽的房頂上張望缚态。 院中可真熱鬧,春花似錦堤瘤、人聲如沸玫芦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桥帆。三九已至,卻和暖如春慎皱,著一層夾襖步出監(jiān)牢的瞬間环葵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工宝冕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留张遭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓地梨,卻偏偏與公主長得像菊卷,于是被迫代替她去往敵國和親缔恳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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