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();
}