MVP模式是在MVC模式的基础之上改进而来的。MVP模式分为:model,view,presenter三部分。三部分的关系如下图所示:
其中PresenterCompl实现IPresenter接口,PresenterCompl中的方法要改变view时通过调用IView中的方法来实现。Model层为PresenterCompl提供数据。
也就是说之前MVC中view的控制都是在activity中实现,但是MVP中对于view的控制在PresenterCompl中实现,但是PresenterCompl又不能够直接的操作view,就通过IView内中的方法来间接的实现控制。
下面来看一个用户登录实现MVP模式的例子:
由上面可以看出View和PresenterCompl和ILoginView的关系。
下面给出整个项目的代码:
UserBean:
public class UserBean {
String name;
String password;
public UserBean(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
}
ILoginPresenter:
public interface ILoginPresenter {
void clear();
void doLogin(String name,String password);
}
ILoginPresenterCompl:
public class ILoginPresenterCompl implements ILoginPresenter{
private ILogView iLogView;
private UserBean userBean;
public ILoginPresenterCompl(ILogView view) {
iLogView=view;
userBean=new UserBean("hanking","123456");
}
@Override
public void clear() {
iLogView.onClearText();
}
@Override
public void doLogin(String name, String password) {
if (name.equals(userBean.getName())&&password.equals(userBean.getPassword()))
{
iLogView.onLoginResult(true);
}
else
{
iLogView.onLoginResult(false);
}
}
}
ILogView:
public interface ILogView {
void onClearText();
void onLoginResult(boolean result);
}
LoginActivity:
public class LoginActivity extends AppCompatActivity implements ILogView,View.OnClickListener{
private EditText name,password;
private Button mLogin,mClear;
private ILoginPresenter loginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loginPresenter=new ILoginPresenterCompl(this);
InitView();
}
public void InitView()
{
name=(EditText)findViewById(R.id.name);
password=(EditText)findViewById(R.id.password);
mClear=(Button)findViewById(R.id.Clear);
mLogin=(Button)findViewById(R.id.mLogin);
mLogin.setOnClickListener(this);
mClear.setOnClickListener(this);
}
@Override
public void onClearText() {
name.setText("");
password.setText("");
}
@Override
public void onLoginResult(boolean result) {
if (result==true)
{
Toast.makeText(this,"登录成功!",Toast.LENGTH_SHORT).show();
}
else if (result==false)
{
Toast.makeText(this,"登录失败!",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onClick(View v) {
int id=v.getId();
String uname=name.getText().toString();
String upassword=password.getText().toString();
switch (id)
{
case R.id.Clear:loginPresenter.clear();break;
case R.id.mLogin:loginPresenter.doLogin(uname,upassword);break;
}
}
}
由上面代码可以知道:IView中负责View的变化,IPresenterCompl中负责对于View中的逻辑控制,也就是说当view要改变时通过IPresenterCompl调用IView中的方法来实现。UserBean中主要是数据对象。
源码下载地址(Android stdio可直接运行)