使用MVP+Retrofit+RxJava+Dagger搭建項(xiàng)目

一、什么是MVP模式?

MVP是MVC的變種,也是一種升級(jí)。要說MVP就要說說MVC,在MVC中Activity其實(shí)就是View層級(jí),但是通常在使用中Activity也是Contrloller,并沒有將View層和Controller層進(jìn)行分離,耦合度大大提高,非常不利于項(xiàng)目的管理。所以也就產(chǎn)生了MVP。

二、MVC、MVP、MVVM區(qū)別和應(yīng)用建議

類型 創(chuàng)建過程 特點(diǎn) 缺點(diǎn) 應(yīng)用建議
MVC C->M+V 分離了Model和Controller Controller變得越來越復(fù)雜 簡(jiǎn)單的、不大修改的頁(yè)面
MVP V->P->M 在MVC的基礎(chǔ)上通過接口徹底分離了View和Model Presenter與View的交互變得瑣碎而復(fù)雜 核心、復(fù)雜、需求變更更快頁(yè)面
MVVM v->VM->M 在MVP的基礎(chǔ)上增加了DataBinding,代碼量更小 XML中包含代碼,定位問題麻煩 核心、復(fù)雜、需求變更快頁(yè)面

三、MVP架構(gòu)設(shè)計(jì)

1. MVP三個(gè)角色

  • View
  • Presenter
  • Model

2. 設(shè)計(jì)思想

MVP把Activity中的UI邏輯抽象成View接口,把業(yè)務(wù)邏輯抽象成Presenter接口,Model層依然還是Model層。

在MVP模式中Activity的功能就是響應(yīng)生命周期和顯示界面,具體的邏輯在Presenter中完成,Presenter是Model和View層的橋梁,這樣就把Model和View進(jìn)行了隔離。

3. 如何設(shè)計(jì)

以下是我的項(xiàng)目中MVP模式的使用類圖:


MVP類圖.jpg

圖中有幾點(diǎn)需要注意:

  • GankFragment直接依賴GankPresenter的實(shí)例,后面可以用Dagger進(jìn)行解藕;
  • GankPresenter依賴IModel,IView,面向接口接口編程。GankModel,GankPresenter,GankFragment分別實(shí)現(xiàn)各自的接口,IGankContract統(tǒng)一管理三者的接口,從而更方便了解P與M,P與V之間的調(diào)用關(guān)系。
  • GankModel不直接封裝數(shù)據(jù)層,而是依賴對(duì)應(yīng)提供數(shù)據(jù)API的接口,面向接口編程,所以就不用關(guān)心底層提供數(shù)據(jù)的方式。實(shí)現(xiàn)各自接口的Impl實(shí)現(xiàn)類就可以實(shí)現(xiàn)二次封裝,隨時(shí)可以替換底層開源庫(kù)。

4. RxJava+Retrofit的理解以及在MVP模式中使用

理解RxJava+Retrofit

5. 理解注解以及Dagger

全面解析注解和Dagger

6. 在MVP模式中使用Dagger

在MVP模式中,因?yàn)镸、V、P三個(gè)角色都可能存在直接的依賴引用,所以在修改某個(gè)角色的時(shí)候,可能也需要修改另外一個(gè)依賴方。
比如在View層中有依賴Presenter,通過利用Dagger2就可以解除兩者的依賴。


public class MainActivity extends AppCompatActivity implements MainContract.View {
    @Inject
    MainPresenter mainPresenter;
    ...
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
         DaggerMainComponent.builder()
                .mainModule(new MainModule(this))
                .build()
                .inject(this);
        //調(diào)用Presenter方法加載數(shù)據(jù)
         mainPresenter.loadData();
         
         ...
    }

}

public class MainPresenter {
    //MainContract是個(gè)接口,View是他的內(nèi)部接口,這里看做View接口即可
    private MainContract.View mView;
    
    @Inject
    MainPresenter(MainContract.View view) {
        mView = view;
    }    
    public void loadData() {
        //調(diào)用model層方法,加載數(shù)據(jù)
        ...
        //回調(diào)方法成功時(shí)
        mView.updateUI();
    }

@Module
public class MainModule {
    private final MainContract.View mView;

    public MainModule(MainContract.View view) {
        mView = view;
    }

    @Provides
    MainView provideMainView() {
        return mView;
    }
}

@Component(modules = MainModule.class)
public interface MainComponent {
    void inject(MainActivity activity);
}

對(duì)應(yīng)項(xiàng)目地址:https://github.com/liuhe1993/myproject

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容