MVP模式架构
- Model:业务逻辑和实体模型
- View:用户交互及页面展示
- presenter:Model与View交互的桥梁
总体来说思路还是比较简单的:
- 1、view层即我们的Activity,继承抽离出view所有操作方法的接口,并引用presenter。
- 2、presenter调用model,执行model中具体业务逻辑。
- 3、model执行具体逻辑,将结果回调给presenter。
- 4、presenter继续将结果回调给view。
使用MVP模式实现简单的登录实例
view层:(继承抽离出view所有操作方法的接口,并引用presenter)
//封装Activity所需要的方法,假设我们需要处理登录成功与登陆失败两种情况
public interface ILoginView {
//登录成功
void onLoginSuccess(String successMsg);
//登录失败
void onLoginFailed(String errorMsg);
}
Activity实现接口并引用presenter:
public class MainActivity extends AppCompatActivity implements ILoginView {
private ILoginPresenter presenter;//presenter引用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter.startLogin();//开始登录
}
@Override
public void onLoginSuccess(String successMsg) {
//UI层接收回调:登录成功
}
@Override
public void onLoginFailed(String errorMsg) {
//UI层接收回调:登录失败
}
}
presenter层:(调用model,执行model的具体逻辑)
public class ILoginPresenter {
private ILoginView view;
private LoginModel model;
public ILoginPresenter(ILoginView view){
this.view = view ;
}
//调用model,执行model具体逻辑
public void startLogin(){
model = new LoginModel(this);
model.startLogin();
}
//将结果回调给层,因为UI持有View的引用,所以结果回调到了UI层
public void onLoginSuccess(String successMsg){
view.onLoginSuccess(successMsg);
}
public void onLoginError(String errorMsg){
view.onLoginFailed(errorMsg);
}
}
model:实现具体业务逻辑
public class LoginModel {
private ILoginPresenter iLoginPresenter;
public LoginModel(ILoginPresenter presenter){
this.iLoginPresenter = presenter;
}
//登录具体逻辑
public void startLogin(){
if(true){
//假设登录成功
iLoginPresenter.onLoginSuccess("success");//结果回调给presenter
}else{
iLoginPresenter.onLoginError("error");//结果回调给presenter
}
}
}
总结
从上面的例子可以看出:使用MVP模式会使得代码多出很多接口及Presenter,但是这样使得代码逻辑更加清晰,尤其是在处理复杂逻辑时,可以将Activity每个业务都抽离成一个Presenter,这样即逻辑清晰也方便我们扩展。例子中业务逻辑很简单,使用MVP返回显现代码累赘,所以说,仁者见仁智者见智,我认为根据具体项目情况选择合理的架构模式。