Android中MVP模式的简单实现

MVP是怎么来的
讲到MVP首先跟大家讲讲MVC,记得有一次在面试的,公司的一个技术总监问了我一个问题:安卓是如何体现MVC的.我当初回答也是OK,但那个技术总监也是面试完了给了我一个准确答案,应该这么说,首先把MVC的几个层次说一下,
1: Modle:数据模型和业务逻辑
2: View:XML(布局文件)
3: Controller: Activity,Fragment
其中View层和Controller层耦合了,可以说View层是Activity,Fragment这种说法也没错.
有位国外的大牛说过一句话,大多数的Android app用的是仅仅是View_Model框架,也就是少了Controller.
正式因为MVC耦合的原因,所以有了MVP
介绍MVP
* Model: 数据模型和业务逻辑
* View: Acitvity,Fragment
* Presenter: 起来桥梁的作用
Presenter 打个比方 presenter好比一个经济人,Moldel好比一个明星,View 比作一个广告商,广告商要找明星代言广告,明星没有空去处理这个事情但是广告商可以通过联系明星的经济人,然后经济人又跟明星说,代言广告有很多钱赚哦,还没什么坏影响,明星一听,有好多钱赚,接了然后二者就达成交易.
给个图片有关MVC和MVP的区别

好了现在开始代码一步一步展示出来,先看看登录界面
这里写图片描述
第一步: Model层 数据模型和业务逻辑
简单,只有一个登录的逻辑
1.1: 登录模型

public interface IUserLoginMolder {
    /**
     * Model:登录模型
     */
    void userLogin(String userName ,String passworld,OnUserLoginListener listener);
}

OnUserLoginListener 是一个接口,就是登录有成功或者失败

/*
 * 用户登录回调接口
 */
public interface OnUserLoginListener {
    /**
     * 登录成功调用
     */
    void loginSuccess(User user);
    /**
     * 登录失败调用
     */
    void loginError();
}

1.2: 业务逻辑

/**
 * Model层,用户登录
 */
public class UserLogin implements IUserLoginMolder {
    @Override
    public void userLogin(String userName, String passworld, OnUserLoginListener listener) {
        User user = new User(userName,passworld);
        //登录业务逻辑
        if ("text".equals(userName) && "text".equals(passworld)) {//登录成功
            listener.loginSuccess(user);
        } else {//登录失败
            listener.loginError();
        }
    }
}
/*
 *  @描述:    用户的Bean类
 */
public class User {

    private String userName;
    private String  passworld;

    public User(String userName, String passworld) {
        this.userName = userName;
        this.passworld = passworld;
    }

    public String getPassworld() {
        return passworld;
    }

    public void setPassworld(String passworld) {
        this.passworld = passworld;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}

第二步:View层

/**
 * View层,如何实现View层,View层是最复杂的一层
 * 1.有什么操作:获取用户名、获取密码
 * 2.有什么用户交互:显示滚动条、隐藏滚动条
 * 3.有什么结果:登录成功跳转主页、登录失败提示用户
 */
public interface IUserLoginView {
    /**获取用户名*/
    String getUsername();
    /**获取密码*/
    String getPassword();

    /**显示滚动条*/
    void showProgressbar();
    /**隐藏滚动条*/
    void hideProgressbar();

    /**登录成功跳转主页*/
    void jump2Main(User user);
    /**登录失败提示用户*/
    void showLoginError();
}

第三步:Presenter层

/**
 * Presenter层
 * 1.p层既然起到桥梁的作用,p层必须持有model和view层对象(成员变量)
 * 2.既然起到桥梁的左右,所以需要提供桥梁方法,当前的业务逻辑是登录,所以桥梁方法也是为了登录服务
 */
public class UserLoginPresenter implements OnUserLoginListener {

    UserLoginView mUserLoginView;
    UserLogin mUserLogin;
    public UserLoginPresenter(UserLoginView view){
    //由于Model和View层没有联系,所以创建对象时只能传一个即View层也就是明星层
        mUserLogin = new UserLogin();
        mUserLoginView = view;
    }

    public void login(){
        //登录一进来就展示加载条
        mUserLoginView.showDialog();
        //开始登录
        mUserLogin.userLogin(mUserLoginView.getUserName(),mUserLoginView.getPassword(),this);

    }

    /**
     * 登录成功
     * @param user
     */
    @Override
    public void loginSuccess(User user) {
        //隐藏加载条
        mUserLoginView.hidDialog();
        //跳转页面
        mUserLoginView.jump2MainActivity();
    }

    /**
     * 登录失败
     */
    @Override
    public void loginError() {
        //隐藏加载条
        mUserLoginView.hidDialog();
        //弹一个登录失败的Toast
        mUserLoginView.loginError();
    }
}

结束了三个层全部完成,最后附上MainActivity代码

public class MainActivity extends AppCompatActivity implements UserLoginView {
    private EditText etUsername;
    private EditText etPassword;
    private ProgressBar progressBar;
    private Context context;
    private Button btnLogin;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_activity_mvp);

        etUsername = (EditText) findViewById(R.id.et_username);
        etPassword = (EditText) findViewById(R.id.et_password);
        progressBar = (ProgressBar) findViewById(R.id.progressBar1);
        btnLogin= (Button) findViewById(R.id.btnLogin);
        context=this;

        //创建一个中间层
        final UserLoginPresenter presenter = new UserLoginPresenter(this);

        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //开始登录
                presenter.login();

            }
        });
    }


    @Override
    public String getUserName() {
        if (TextUtils.isEmpty(etUsername.getText().toString().trim())) {
            return "";
        }

        return etUsername.getText().toString().trim();
    }

    @Override
    public String getPassword() {
        if (TextUtils.isEmpty(etPassword.getText().toString().trim())) {
            return "";
        }
        return etPassword.getText().toString().trim();
    }

    @Override
    public void showDialog() {
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public void hidDialog() {
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public void jump2MainActivity() {
        showToast("跳转到另一个页面");
    }
    @Override
    public void loginError() {
        showToast("账号或者密码错误");
    }
    public void showToast(String msg){
        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
    }
}

结束,希望对大家有帮助

猜你喜欢

转载自blog.csdn.net/qq_35651451/article/details/52423175
今日推荐