What?
Model-View-Presenter
Why?
Activity太忙了!既作为View又作为Controller,还要忙着与Model耦合
Activity一般会采用布局文件来作为视图,但大多情况下还需要在Activity中对View进行动态布局、变化,所以我说Activity承担了View的工作
Activity显然也是一个Controller,当用户与视图交互,还是Activity来处理相关视图逻辑
Activity还需要调用Model来处理相关业务逻辑,与Model也是耦合的
How?
降低Activity的职责,将其仅作为一个View,不再与Model有任何耦合
抽出Presenter,Presenter通过接口访问View,包含Model的引用;View包含Presenter的引用,间接调用Model层处理业务逻辑,见下图
A Simple Example
整体包图见下图,分model、view、presenter三个包
model下VO表示Value Object,其实就是java bean,仅包含get、set方法,BO表示Bussiness Object,处理业务逻辑,
那么BO中异步完成业务后如何通知View呢?就靠这个Callback接口,由Presenter中实现
model.BO.IUserModel
1 | public interface IUserModel { |
model.BO.UserModel
1 | public class UserModel implements IUserModel{ |
model.VO.LoginRequest
1 | public class LoginRequest { |
model.VO.LoginResponse
1 | public class LoginResponse { |
model.Callback
1 | public interface Callback<T> { |
presenter.ILoginPresenter
1 | public interface ILoginPresenter{ |
presenter.LoginPresenter
1 | public class LoginPresenter implements ILoginPresenter { |
view.ILoginView
1 | public interface ILoginView { |
view.LoginActivity
1 | public class LoginActivity extends AppCompatActivity implements ILoginView{ |
是不是结构还挺清楚的呢?至于是否要在项目中采用MVP,其实还要看项目的规模
demo图如下