理解Android中的MVP架构

学习用例: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中既控制页面又处理逻辑,后期维护起来也会相对舒服一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值