Android 的 MVP 模式浅尝。
Presenter
负责所有业务数据操作的实现。
创建的时候把相应的 View 也传递过来,在 View 中实现 setPresenter(Presenter presenter) 类似接口,在 presenter 中将自身设置给 View。
View
负责展示给用户的显示UI。
通过实现 setPresenter(Presenter presenter) 接口得到对 Presenter的引用,在界面 UI 发生点击等事件后,调用相应的 presenter 的方法实现数据获取,presenter 在获取到数据后,会调用自身引用的 View 的相应的展示数据的方法进行UI响应。
Contract类
由于 View 和 Presenter 都互相持有对方的引用,并且每一个 View 也就是我们应用的每一个界面,他们的数据操作都有所不同,所以为了方便管理,同一个界面的 View 和 Presenter 应该有一个方法的约束类。
也就是说:每一个 View 能够执行的操作是固定了的,那么相对应的 Presenter 的方法也是相对固定的。例如:一个管理 task 的界面,他的 contract 类可以做成如下:
public interface TasksContract {
//task这个 View 能够执行的 UI 层面的操作方法
interface View extends BaseView<Presenter> {
void setLoadingIndicator(boolean active);
void showTasks(List<Task> tasks);
void showAddTask();
void showTaskDetailsUi(String taskId);
void showTaskMarkedComplete();
void showTaskMarkedActive();
void showCompletedTasksCleared();
void showLoadingTasksError();
void showNoTasks();
void showActiveFilterLabel();
void showCompletedFilterLabel();
void showAllFilterLabel();
void showNoActiveTasks();
void showNoCompletedTasks();
void showSuccessfullySavedMessage();
boolean isActive();
void showFilteringPopUpMenu();
}
//task 这个 View UI 的方法需要调用的数据解析类的方法
interface Presenter extends BasePresenter {
void result(int requestCode, int resultCode);
void loadTasks(boolean forceUpdate);
void addNewTask();
void openTaskDetails(@NonNull Task requestedTask);
void completeTask(@NonNull Task completedTask);
void activateTask(@NonNull Task activeTask);
void clearCompletedTasks();
void setFiltering(TasksFilterType requestType);
TasksFilterType getFiltering();
}
}
其中接口 BaseView 定义了所有的 View 类都必须实现的基础方法:
public interface BaseView<T> {
void setPresenter(T presenter);
}
同样接口 BasePresenter 定义了所有的 Presenter 都必须实现的基础方法:
public interface BasePresenter {
void start();
}
网友评论