MVP模式通过presenter隔离了View和Model两个模块之间的交互,实现View和Model完全解耦。
- Model:数据
- View:视图
- Presenter:控制中心
在Google的MVP的demo中有BaseView和BasePresenter两个基础接口,具体的业务去实现具体的行为接口,其中还有一个Contract接口,作为链接View和PreSenter两个模块的一种写法。
/**其中泛型T表示presenter的类型*/
public interface BaseView<T>{
}
public interface BasePresenter{
//入口方法
void start();
}
分析一下TasksContract,可以大概了解Presenter中都是对应的数据操作行为,View中都是对应的UI操作行为。程序中并没有TasksContract的具体实现,它的存在就是关联一个页面的Presenter和View的作用。
public interface TasksContract{
interface Presenter extends BasePresenter{
//数据操作行为方法
}
interface View extends BaseView<Presenter>{
//UI操作行为方法
}
}
数据这块Demo中处理的相对复杂,每个业务数据Model都是有一个对应的package目录中的文件。在数据模块中有一个TasksDataSource的接口,其中定义了一系列与数据源交互的行为,例如:获取数据、更新、删除等等。
在Googlde的框架图中可一看到,在数据这块区分了Local和Remote两个数据来源,并且在模块对外输出的出口TasksRepository还使用一层内存cache,来实现三级缓存的形式。TasksLocalDataSource、TasksRemoteDataSource、TasksRepository都是实现的TasksDataSource接口,并且都是单例;其中TasksRepository作为唯一的出入口。
在具体实现的Presenter的构造函数中传入对应的View对象以及Repository对象,以此来达到Presenter结合View和Model的作用。
这里基本就明白了
- View做UI交互
- Model相对复杂,底层以DataSource操作数据,再使用Repository作为数据的出入口
- Presenter则是负责统一流程,去调度View和Model分别控制UI响应和数据响应
再看一下Demo的文件目录结构,帮助理解