MVP模式在安卓中的使用

所谓的mvp,即是(model-处理业务逻辑(主要是数据读写,或者与后台通信(其实也是读写数据)),view-处理ui控件,presenter-主导器,操作model和view)
主要是把业务逻辑拆分出来,让activity中只保留和界面有关的代码。


MVP:view/presenter/model/bean   包名小写
接口的定义以I开头
实现类以Impl结尾



1)view处理与页面有关的逻辑,将Actvity视为View层
Presenter与View之间的交互是通过接口ILoginView实现的。(数据由presenter————>到activity 中)
Activity中实现IView接口,在其中操作view,实例化一个presenter变量。(数据传递由activity ————>presenter)


2)presenter:model与view的桥梁,让Model和View完全解耦,相互不知道对方的存在,让presenter层负责另外两层的交互。
为presenter 建立构造函数, 持有两个接口的引用。接口成员变量调用其中的方法。


3)model:处理具体的业务逻辑,和实体模型(本质上是读写数据).  建立model,先写接口,后写实现,比如请求网络数据。


在接口定义的所有的抽象方法都是没有返回值的。


Activity中的代码:

package com.example.tuhuadmin.fanxinglei.TestLogin;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.tuhuadmin.fanxinglei.BaseActivity;
import com.example.tuhuadmin.fanxinglei.R;
import com.example.tuhuadmin.fanxinglei.TestLogin.bean.LoginBean;
import com.example.tuhuadmin.fanxinglei.TestLogin.presenter.LoginPresenter;
import com.example.tuhuadmin.fanxinglei.TestLogin.view.ILoginView;
import com.example.tuhuadmin.fanxinglei.utils.ToastUtil;

/**
 * Created on 2016/8/5.
 * Author:crs
 * Description:XXX
 */
public class LoginActivity extends BaseActivity implements View.OnClickListener, ILoginView {

    private EditText et_name;
    private EditText et_password;
    private Button btn_login;
    private LoginPresenter loginPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        initViews();
        //当前类如何持有presenter类的引用
        loginPresenter = new LoginPresenter(this);
        initListener();
    }

    private void initListener() {
        btn_login.setOnClickListener(this);
    }

    private void initViews() {
        et_name = (EditText) findViewById(R.id.et_name);
        et_password = (EditText) findViewById(R.id.et_password);
        btn_login = (Button) findViewById(R.id.btn_login);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_login: {
                String name = et_name.getText().toString();
                String password = et_password.getText().toString();
                //按照业务逻辑抽取方法
                loginPresenter.login(name, password);
            }
            break;
        }
    }


    @Override
    public void loginSuccess(String msg) {
        ToastUtil.showLong(LoginActivity.this,msg);
    }

    @Override
    public void loginFail(String strFail) {
        ToastUtil.showLong(LoginActivity.this,strFail);
    }
}

ILoginView:

package com.example.tuhuadmin.fanxinglei.TestLogin.view;


/**
 * Created on 2016/8/5.
 * Author:crs
 * Description:登录结果回调到activity中
 */
public interface ILoginView {
    void loginSuccess(String msg);
    void loginFail(String strFail);
}

IloginPresenter:
package com.example.tuhuadmin.fanxinglei.TestLogin.presenter;

/**
 * Created on 2016/8/5.
 * Author:crs
 * Description:XXX
 */
public interface ILoginPresenter {
    void loginSuccess(String msg);
    void loginFail(String msgFail);

}

LoginPresenter:

package com.example.tuhuadmin.fanxinglei.TestLogin.presenter;

import com.example.tuhuadmin.fanxinglei.TestLogin.model.LoginModelImplement;
import com.example.tuhuadmin.fanxinglei.TestLogin.view.ILoginView;

/**
 * Created on 2016/8/5.
 * Author:crs
 * Description:XXX
 */
public class LoginPresenter implements ILoginPresenter {
    com.example.tuhuadmin.fanxinglei.TestLogin.model.ILoginModel ILoginModel;
    ILoginView iLoginView;

    //通过构造方法,让presenter类持有model和view两个接口的引用
    public LoginPresenter(ILoginView iLoginView) {
        ILoginModel = new LoginModelImplement(this);
        this.iLoginView = iLoginView;
    }

    //根据业务逻辑定义的方法
    public void login(String name, String password) {
        ILoginModel.getWorkData(name, password);
    }

    @Override
    public void loginSuccess(String msg) {
        iLoginView.loginSuccess(msg);
    }

    @Override
    public void loginFail(String msgFail) {
        iLoginView.loginFail(msgFail);
    }
}

ILoginModel:主要用于定义具体的业务逻辑接口

package com.example.tuhuadmin.fanxinglei.TestLogin.model;

/**
 * Created on 2016/8/5.
 * Author:crs
 * Description:XXX
 */
public interface ILoginModel {
    void getWorkData(String name, String password);
}

LoginModelImplement:

package com.example.tuhuadmin.fanxinglei.TestLogin.model;

import com.example.tuhuadmin.fanxinglei.TestLogin.presenter.ILoginPresenter;
import com.example.tuhuadmin.fanxinglei.TestLogin.presenter.LoginPresenter;

/**
 * Created on 2016/8/5.
 * Author:crs
 * Description:XXX
 */
public class LoginModelImplement implements ILoginModel {

    //进行网络数据的请求  处理具体的业务逻辑
    public ILoginPresenter iLoginPresenter;
    public LoginModelImplement(LoginPresenter loginPresenter) {
        this.iLoginPresenter = loginPresenter;
    }

    @Override
    public void getWorkData(String name, String password) {
        //获取网络数据操作,bean
        if (iLoginPresenter != null) {
            //业务逻辑处理完毕
            if (name.equals("1111") && password.equals("1111")) {
                iLoginPresenter.loginSuccess("登录成功");
            } else {
                iLoginPresenter.loginFail("登录失败1111");
            }
        }

    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值