一点对google官方的todo-mvp的理解
首先定义了三个接口:
BaseView : View接口
BasePresenter : Presenter接口
TasksDataSource : Model接口
public interface BaseView<T>{
void setPresenter(T presenter);
}
public interface BasePresenter{
void start();
}
public interface TasksDataSource{
interface LoadTasksCallback{
void onTasksLoaded(List<Task> tasks);
void onDataNotAvailable();
}
interface GetTaskCallback{
void onTaskLoaded(Task task);
void onDataNotAvailable();
}
void getTasks(@NonNull LoadTasksCallback callback);
void getTask(@NonNull GetTaskCallback callbaxk);
}
另外为了让View 和 Presenter 容易理解另外加了一个辅助接口、
public interface TasksContract{
interface View extends BaseView<Presenter>{
}
interface Presenter extends BasePresenter{
}
}
注:
与常规MVP不同的地方:
Model为所有Presenter共用。(在官方的示例中Model为TasksRepository)
Activity不是作为V来使用,而是用来管理作为V的fragment和Presenter
Presenter 的start()方法在View(TasksFragment)中的Resume()方法中被调用。
在Presenter的实现类TasksPresenter的构造函数里面
实现Presenter与View和Model的关联
并实现View 与 Presenter的关联
而Presenter的创建在TasksActivity
即Presenter在TasksActivity创建对象的时候实现 :
Presenter与View和Model的关联
View 与 Presenter的关联
public TasksPresenter(@NotNull TasksRepository tasksRepository , @NotNull TasksContract.View tasksView){
mTasksRepository = checkNotNull(tasksRepository, "tasksRepository Cannot be null");
mTaskView = checkNotNull(tasksView,"tasksView Cannot be null");
mTaskView.setPresenter(this);
}
//这里好像并没有Model与Presenter的关联
//MVP把业务逻辑代码全部移到了Presenter中,所以Model不需要与Presenter关联,也是因此Model可以被多个Presenter共用。
//如果在这里让Model 与 Presenter 相关联,那么Presenter只是起到接口转发的作用,就与MVC无太大差异。
再来看看Model
public interface TasksDataSource{
interface LoadTasksCallback{
void onTasksLoaded(List<Task> tasks);
void onDataNotAvailable();
}
interface GetTaskCallback{
void onTaskLoaded(Task task);
void onDataNotAvailable();
}
void getTasks(@NonNull LoadTasksCallback callback);
void getTask(@NonNull GetTaskCallback callbaxk);
}
在官方的示例中Model的最顶层接口是TasksDataSource。
TasksDataSource中提供两个给Presenter回调的接口,并提供了调用的方法。
TasksDataSource的具体实现类是TasksRepository,TasksLocalDataSource,TaskRemoteDataSource。
其中TasksRepository又与TasksLocalDataSource,TaskRemoteDataSource关联。
TasksLocalDataSource,TaskRemoteDataSource分别表示本地数据操作,如数据库,文件操作和远程操作如http请求。