学习用例:http://blog.csdn.net/vector_yi/article/details/24719873?utm_source=tuicool&utm_medium=referral
功能是点击存
按钮时将输入框中的数据存起来,点击取
按钮时根据id输入框中输入的id查找对应的人名信息,并呈现在页面上。
1. 根据View视图定义View接口
Android属于前端应用,一切功能基于界面交互,因此第一步应该是根据功能设计界面,再根据界面功能,设计View接口。
public interface IUserView {
int getId();//存人物时需要从界面上获取id
String getFirstName();//存人物时需要从界面上获取FirstName
String getLastName();//存人物时需要从界面上获取LastName()
void setFirstName(String firstName);//根据id取人物时需要将firstName设置到页面中
void setLastName(String lastName);//根据id取人物时需要将lastName设置到页面中
}
这样就根据功能需求设计了View层的接口,用于对View进行操作。
2. 设计Model层的接口
Model层用于对数据进行操作,因此在此例中,数据层主要任务是将View中填写的id、firstName和lastName保存起来,以及根据view中填写的id,查找出对应的人名,因此Model接口的设计应该具有这两个功能:
public interface IUserModel {
//将View中输入的人名信息保存
void saveUser(int id,String firstName,String lastName);
//根据View中输入的id查找人名信息
UserBean getUser(int id);
}
3. 实现Presenter
Presenter的主要作用是连接View层和Model层,在此例中就是从View层中将用户输入的人名信息交给Model层保存,以及根据View层中输入的id,从Model层中查找对应的人名信息,之后将人名信息传递给View层呈现:
public class UserPresenter {
//因为Presenter用于连接View层和Model层,因此需要同时持有View层和Model层
private IUserView mView;
private IUserModel mModel;
public UserPresenter(){
//构造方法用于接收View层和Model层实例
//此时View层实例(Activity)和Model层实例尚未创建,因此此处为空
}
public void saveUser(){
//从View层中获取用户输入的信息,存入Model层中
mModel.saveUser(mView.getId(),
mView.getFirstName(),
mView.getLastName());
}
public void selectUser(){
//根据View层中输入的id,在Model层中查找对应的人名信息
UserBean bean= mModel.getUser(mView.getId());
//将查找到的信息交由View层呈现
mView.setFirstName(bean.getFirstName());
mView.setLastName(bean.getLastName());
}
}
以上就是MVP架构在Android中的应用思路,仅为思路,没有具体实现。下面进行具体实施,布局文件见最上面的效果图。
1. 实现View接口
//在MVP架构中,Activity只承担View层职能,Activity继承View层接口
public class UserActivity extends AppCompatActivity implements IUserView,View.OnClickListener{
//此处定义View层的一些控件,以及一个Presenter实例
//因为View层只负责页面处理,具体数据操作需要交给Presenter处理
//因此View层要持有一个Presenter层实例,以便交付任务
private EditText mIdEt,mFirstNameEt,mLastNameEt;
private Button mSaveBtn,mSelectBtn;
private UserPresenter mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user);
findViews();
//因为Presenter层负责View层与Model层的交互,
//因此Presenter层需要持有View层和Model层的实例,
//此处将View层实例通过Presenter层构造方法交付
mPresenter= new UserPresenter(this);
}
private void findViews() {
mIdEt= (EditText) findViewById(R.id.editText);
mFirstNameEt= (EditText) findViewById(R.id.editText2);
mLastNameEt= (EditText) findViewById(R.id.editText3);
mSaveBtn= (Button) findViewById(R.id.button);
mSaveBtn.setOnClickListener(this);
mSelectBtn= (Button) findViewById(R.id.button2);
mSelectBtn.setOnClickListener(this);
}
//下面是View层接口中定义的功能
//View层只需要管好自己的事就可以了
//在此例中View层只需要将用户输入的信息取出以及将查询到的数据呈现在页面上
@Override
public int getId() {//取出用户输入的id
return Integer.parseInt(mIdEt.getText().toString());
}
@Override
public String getFirstName() {//取出用户输入的FirstName
return mFirstNameEt.getText().toString();
}
@Override
public String getLastName() {//取出用户输入的LastName
return mLastNameEt.getText().toString();
}
@Override
public void setFirstName(String firstName) {
//将查询到的FirstName在FirstName输入框中呈现出来
mFirstNameEt.setText(firstName);
}
@Override
public void setLastName(String lastName) {
//将查询到的LastName在LastName输入框中呈现出来
mLastNameEt.setText(lastName);
}
@Override
public void onClick(View v) {
int vId= v.getId();
switch (vId){
case R.id.button://‘存’按钮点击事件
//通知Presenter保存数据
mPresenter.saveUser();
break;
case R.id.button2://‘读’按钮点击事件
//通知Presenter读取数据
mPresenter.selectUser();
break;
default:
break;
}
}
}
2. 实现Model层接口
public class UserModel implements IUserModel{
//定义一个集合用来保存人名信息
private ArrayList<UserBean> mUsers;
public UserModel(){
mUsers= new ArrayList<>();
}
//下面是Model层接口中定义的功能
//Model层同样只需要负责自己的事
//在此例中Model层只需要保存用户输入的人名信息以及根据id查找对应的人名信息
@Override
public void saveUser(int id, String firstName, String lastName) {
//将用户输入的人名信息保存到集合中
UserBean bean= new UserBean(id,firstName,lastName);
mUsers.add(bean);
}
@Override
public UserBean getUser(int id) {
//根据指定的id查找对应的人名信息并返回
for (int i= 0; i< mUsers.size(); i++){
UserBean bean= mUsers.get(i);
if (bean.getId()== id){
return bean;
}
}
return null;
}
}
3. 修改Presenter层
public class UserPresenter {
private IUserView mView;
private IUserModel mModel;
public UserPresenter(IUserView view){
mView= view;
mModel= new UserModel();
}
public void saveUser(){
mModel.saveUser(mView.getId(),
mView.getFirstName(),
mView.getLastName());
}
public void selectUser(){
UserBean bean= mModel.getUser(mView.getId());
mView.setFirstName(bean.getFirstName());
mView.setLastName(bean.getLastName());
}
}
可以看到Presenter层的代码几乎没有改变,只是把View层和Model层的实例传了进来,作为View层和Model层之间的主持人
,在View层和Model层接口定义完成(即功能确定完成)之后,Presenter的功能就基本确定了,最后只需要根据实际情况做少许修改,并将View层和Model层的实例传入即可,让Presenter知道要去主持哪个View和哪个Model之间的交互。
小结:
刚开始了解MVP架构在Android中的应用,明显的感觉是代码结构十分清晰,每一层职责单一各司其职,再也不需要在Activity中既控制页面又处理逻辑,后期维护起来也会相对舒服一些。