本帖最后由 大山哥哥 于 2017-2-28 23:43 编辑
MVP(Model-View-Presenter) 主要目的都是划分模块职责,降低模块耦合,易测试,提高代码复用,这里主要针对Android平台来简单分析MVP.
1.层级责任 Model: 负责数据的检索,持久化等操作 View: 负责UI的绘制和用户的交互 Presenter: 作为Model和View的中间协调部分,负责两者之间的业务逻辑处理
2.MVP的优缺点 优点:降低耦合,层级职责更明显,易于单元测试 缺点:造成类数量爆炸,代码复杂度和学习成本高,在某些场景下presenter的复用会产生接口冗余
3.MVP简单的demo,登录逻辑用mvp进行编码
3.1项目结构 3.2 model层用来进行登录逻辑判断 LoginModel接口 [AppleScript] 纯文本查看 复制代码 public interface LoginModel {
public void login(String userName,String psw);
}
LoginModelImpl用来实例化接口,并通知presenter登录结果 [AppleScript] 纯文本查看 复制代码 public class LoginModelImpl implements LoginModel {
private LoginPresenter mLoginPresenter;
public LoginModelImpl(LoginPresenter mLoginPresenter) {
this.mLoginPresenter = mLoginPresenter;
}
@Override
public void login(String userName, String psw) {
//将用户名,密码发送的服务器
MyLogger.d("userName "+userName+" psw "+psw);
//将返回结果返回给presenter,这里假设登录成功
mLoginPresenter.loginStatus(true);
}
}
3.3.View层
把View层针对控件操作抽象出来一些列的接口 [AppleScript] 纯文本查看 复制代码 public interface LoginView {
public void showLoginStatus(boolean status);
}
在Activity里面实现该接口的控件操作,并且初始化Presenter,这时可以看到Activity里面没有逻辑处理,只是对UI的控件进行数据或者行为的操作,所有的动作都是有Presenter的接口来实现,这样在项目里面会极大得精简Activity的体积. [AppleScript] 纯文本查看 复制代码 public class LoginActivity extends AppCompatActivity implements LoginView {
private LoginPresenter mLoginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLoginPresenter = new LoginPresenterImpl(this);
final EditText userName = (EditText) findViewById(R.id.et1);
final EditText password = (EditText) findViewById(R.id.et2);
Button login = (Button) findViewById(R.id.button);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MyLogger.d("onClick");
mLoginPresenter.login(userName.getText().toString(), password.getText().toString());
}
});
}
@Override
public void showLoginStatus(boolean status) {
MyLogger.d("status=" + status);
Toast.makeText(this, "status " + status, Toast.LENGTH_SHORT).show();
}
}
3.4.Presenter层
在Presenter层里面,Presenter掌握着View和Model的所有接口,Presenter就可以根据不同的业务逻辑通过MV两层的接口来实现特定的功能,让M和V独立出来. [mw_shl_code=applescript,true]public class LoginPresenterImpl implements LoginPresenter {
private LoginView mLoginView;
private LoginModel mLoginModel;
public LoginPresenterImpl(LoginView mLoginView) {
this.mLoginView = mLoginView;
mLoginModel = new LoginModelImpl(this);
}
@Override
public void login(String userName, String psw) {
MyLogger.d("userName " + userName + " psw " + psw);
mLoginModel.login(userName, psw);
}
@Override
public void loginStatus(boolean status) {
MyLogger.d("status " + status);
mLoginView.showLoginStatus(status);
}
}
|