Android todo-mvp

来源:互联网 发布:餐饮排队叫号软件 编辑:程序博客网 时间:2024/05/18 12:34

一点对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请求。

原创粉丝点击