MVP模式使用心得

之前项目中多次使用了MVP模式,今天我也来分享下关于MVP 的使用心得,
废话不多说,直接挑干货来,
首先来简单介绍下mvp
这里写图片描述
从图中可以直观的看出,view 与model 完全解耦,
MVP模式的核心思想:
MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model。
具体使用方法如下
1)项目结构
这里写图片描述
2)建立UserBean用于存放数据实体

public class UserBean {
    private String userName;
    private String userTel;
    public UserBean(String userName, String userTel) {
        this.userName = userName;
        this.userTel = userTel;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserTel() {
        return userTel;
    }
    public void setUserTel(String userTel) {
        this.userTel = userTel;
    }
}

3)Model层实现
model通过接口回调 通知presenter网络加载结果

//model 接口
public interface MvpModel {
    void loadUser(String userName, BaseCallBack callBack);
}
//model实现类,
public class MvpModeImpl implements MvpModel {
    @Override
    public void loadUser(String userName, final BaseCallBack callBack) {
        //此处使用Retrofit2.0加载网络数据,关于Retrofit2.0使用
        //详见我的微博《Retrofit2.0使用详解》
        Call<UserBean> call = MyApplication.loadUtils.getUserInfo(userName);
        call.enqueue(new Callback<UserBean>() {
            @Override
            public void onResponse(Call<UserBean> call, Response<UserBean> response) {
//                callBack.loadSuccess(response.body());
                UserBean bean = new UserBean("userName", "123456");
                callBack.loadSuccess(bean);
            }
            @Override
            public void onFailure(Call<UserBean> call, Throwable t) {
                callBack.loadError("加载失败");
            }
        });
    }
}

4)Presenter 层实现
通过model 对象调用对应数据加载方法,传递BaseCallBack,回调通知view 相关方法更新ui

**
 * Presenter  ,持有 model  和view 引用
 */

public class MvpPresenter {
    MvpModel model;
    MvpBaseView view;

    public MvpPresenter(MvpBaseView view) {
        this.view = view;
        model = new MvpModeImpl();
    }

    public void loadUser(String userName) {
        model.loadUser(userName, new BaseCallBack() {
            @Override
            public void loadSuccess(Object o) {
                view.upDateView(o);
            }

            @Override
            public void loadError(String errorMsg) {
                view.showMsg(errorMsg);
            }
        });

    }
}

5)View 层实现
建立view接口(更新ui中的view状态)

public interface MvpBaseView {
    //加载成功更新view
    void upDateView(Object o);

    //显示错误信息
    void showMsg(String msg);

}

6)Activity Fragment 具体实现
Activity 或Fragment 中实现iview接口,在其中操作view,
实例化一个presenter对象。
activity_main.xml只有2个TextView 代码忽略

public class MainActivity extends AppCompatActivity implements MvpBaseView {

    private TextView name, tel;
    private MvpPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
    }
    //初始化view
    private void initView() {
        name = (TextView) findViewById(R.id.name);
        tel = (TextView) findViewById(R.id.tel);
    }
     //初始化data
    private void initData() {
        presenter = new MvpPresenter(this);
        presenter.loadUser("test");
    }
     //更新ui方法
    @Override
    public void upDateView(Object o) {
        UserBean bean = (UserBean) o;
        if (bean != null) {
            name.setText(bean.getUserName());
            name.setText(bean.getUserTel());
        }
    }
    @Override
    public void showMsg(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
    }
}

7)总结
所谓的mvp,即是(model-处理业务逻辑(主要是数据读写,或者与后台通信),view-处理ui控件,presenter-主导器,操作model和view)

  1. Activity 或Fragment 实现View接口,创建 presenter对象,并将view引用传递给presenter,调用preserter方法加载数据

  2. presenter持有view引用,创建model实例,通过model实例调用model读写数据方法,并传递回调接口引用,presenter等待model 读写结束,通知view 更新UI

  3. model类读写数据(网络或SQlite等方式),通过callBack对象通知presernter

Tips
mvp使用的优点就是老生常谈的oop编程追求的高内聚,低耦合,提高可维护性,多人员开发同一项目互不冲突
但缺点也是显而易见,由于项目业务逻辑越来越复杂,会多出很多接口类,项目体积变大
为了避免过度设计,请酌情使用mvp设计模式进行项目开发。

代码地址:(https://github.com/lc615762546/AndroidMVPDemo)
//更多精彩技术分享请关注我的微博 谢谢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值