先上官方源代碼:
Todo-MVP
可以看到官方MVP代碼的包結(jié)構(gòu)舱呻,是根據(jù)業(yè)務(wù)來(lái)劃分,每個(gè)包里邊都有一個(gè)MVP結(jié)構(gòu)。Activity+Fragment相當(dāng)于View,Presenter用來(lái)連接View和Model奏属。
關(guān)于Model,官方例子里的Model是按照數(shù)據(jù)源分為L(zhǎng)ocal和Remote潮峦,常見(jiàn)的Local數(shù)據(jù)包括Database囱皿、File勇婴、SharedPreference,Remote就是從網(wǎng)絡(luò)存取數(shù)據(jù)铆帽。
官方例子里有個(gè)Contract比較有意思咆耿,這個(gè)接口將V和P放在一起,以及它們所有的方法爹橱,先看一下其中一個(gè)Contract的源碼:
public interface TaskDetailContract {
interface View extends BaseView<Presenter> {
void setLoadingIndicator(boolean active);
void showMissingTask();
void hideTitle();
void showTitle(String title);
void hideDescription();
void showDescription(String description);
void showCompletionStatus(boolean complete);
void showEditTask(String taskId);
void showTaskDeleted();
void showTaskMarkedComplete();
void showTaskMarkedActive();
boolean isActive();
}
interface Presenter extends BasePresenter {
void editTask();
void deleteTask();
void completeTask();
void activateTask();
}
}
每個(gè)Contract里邊都定義了不同的View和Presenter接口,從整體看代碼邏輯比較清楚窄做。
關(guān)于Contract愧驱,如果APP的每個(gè)頁(yè)面邏輯相差不多的話,Contract是可以去掉的椭盏∽檠猓可以讓Activity可以繼承同一個(gè)BaseActivity(Fragment同理),BaseActivity實(shí)現(xiàn)一個(gè)IActivity接口掏颊,將Presenter調(diào)用Activity的方法都寫(xiě)在這個(gè)接口里糟红。而所有的Presenter都實(shí)現(xiàn)一個(gè)BasePresenter,然后在BasePresenter里引用IActivity乌叶。