认识Android MVP

MVP 是Model—View—Presenter 173426_dM8k_1398907.png

如上图所示可以看见MVP模式需要具备如下三要素:

  1. 最左侧的View。也就是Android中的Activity。同时需要创建一个View的抽象接口View interface。需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合。

  2. 最右侧的Model。用来操做实际数据(譬如数据存储等)。有时也需要创建一个Model的抽象接口Model interface用来降低耦合。

  3. 中间的Presenter。作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

MVP和MVC有啥区别呢

这时候你会发现MVC与MVP的结构图都有很大区别,具体区别如下:

MVP架构:

View不直接与Model交互,而是通过与Presenter交互来与Model间接交互。
Presenter与View的交互是通过接口来进行的。
通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。

MVC架构:

View可以与Model直接交互。
Controller是基于行为的,并且可以被多个View共享。
可以负责决定显示哪个View。

MVP 项目链接https://github.com/yanbober/Android-Blog-Source/tree/master/Android-MVP-Demo

model层抽象接口:

public interface IInfoModel {//从数据提供者获取数据方法
    InfoBean getInfo();
    //存入数据提供者方法
    void setInfo(InfoBean info);
}

model层实现类

public class InfoModelImpl implements IInfoModel {
    //模拟存储数据
    private InfoBean infoBean = new InfoBean();
    @Override
    public InfoBean getInfo() {
        //模拟存储数据,真实有很多操作
        return infoBean;
    }
    @Override
    public void setInfo(InfoBean info) {
        //模拟存储数据,真实有很多操作
        infoBean = info;
    }
}

View层的抽象接口:

public interface IInfoView {
    //给UI显示数据的方法
    void setInfo(InfoBean info);
    //从UI取数据的方法
    InfoBean getInfo();
}

Presenter的角色更像是一个设计模式的适配器类,负责对接UI与数据逻辑。所以不妨先看下Presenter的实现:

public class Presenter {
    private IInfoModel infoModel;
    private IInfoView infoView;
    public Presenter(IInfoView infoView) {
        this.infoView = infoView;
        infoModel = new InfoModelImpl();
    }
    //供UI调运
    public void saveInfo(InfoBean bean) {
        infoModel.setInfo(bean);
    }
    //供UI调运
    public void getInfo() {
        //通过调用IInfoView的方法来更新显示,设计模式运用//类似回调监听处理
        infoView.setInfo(infoModel.getInfo());
    }
}

如下展示了View层的实现代码:

public class MainActivity extends ActionBarActivity implements IInfoView, View.OnClickListener{
    private EditText inputId, inputName, inputAddr;
    private Button saveBtn, loadBtn;
    private TextView infoTxt;
    private Presenter presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
    }
    private void initData() {
        presenter = new Presenter(this);
        inputId = (EditText) findViewById(R.id.id_input);
        inputName = (EditText) findViewById(R.id.name_input);
        inputAddr = (EditText) findViewById(R.id.addr_input);
        saveBtn = (Button) findViewById(R.id.input_confirm);
        loadBtn = (Button) findViewById(R.id.get_confirm);
        infoTxt = (TextView) findViewById(R.id.show);
        saveBtn.setOnClickListener(this);
        loadBtn.setOnClickListener(this);
    }
    @Override
    public void setInfo(InfoBean info) {
        StringBuilder builder = new StringBuilder("");
        builder.append(info.getId());
        builder.append("\n");
        builder.append(info.getName());
        builder.append("\n");
        builder.append(info.getAddress());
        infoTxt.setText(builder.toString());
    }
    @Override
    public InfoBean getInfo() {
        InfoBean info = new InfoBean();
        info.setId(Integer.parseInt(inputId.getText().toString()));
        info.setName(inputName.getText().toString());
        info.setAddress(inputAddr.getText().toString());
        return info;
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.input_confirm:
                presenter.saveInfo(getInfo());
                break;
            case R.id.get_confirm:
                presenter.getInfo();
                break;
        }
    }
}


到此解耦并行开发的App编码工作已经完成


转载于:https://my.oschina.net/qxf323/blog/637266

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值