Android中的MVP模式学习


1. MVP模式简介

1.1 MVP所对应的意义

MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。

M与V是不直接关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层,其负责调控View与Model之间的间接交互。
MVP关系模型

2. MVP模式的应用

2.1 model层描述和具体代码

提供想要展示在view层的数据具体业务逻辑处理的实现

package com.fw.mvp.mvp.model;

import com.fw.mvp.callback.MCallback;

/**
 * description :Model层接口
 * author : apple
 * date : 2021/6/16 15:19
 */
public interface IMVPModel {
    /**
     * 成功:返回数据
     * 失败:回调失败
     *
     * @param name
     * @param mCallback
     */
    void getAcountData(String name, MCallback mCallback);
}

package com.fw.mvp.mvp.model;

import com.fw.mvp.bean.Acount;
import com.fw.mvp.callback.MCallback;

import java.util.Random;

/**
 * description :Model层实现
 * author : apple
 * date : 2021/6/16 11:06
 */
public class MVPModel implements IMVPModel {

    /**
     * 成功:返回数据
     * 失败:回调失败
     *
     * @param name
     * @param mCallback
     */
    @Override
    public void getAcountData(String name, MCallback mCallback) {
        Random random = new Random();
        boolean isSuccess = random.nextBoolean();
        if (isSuccess) {
            Acount acount = new Acount();
            acount.setName(name);
            acount.setLevel(111);
            mCallback.onSuccess(acount);
        } else {
            mCallback.onFail();
        }
    }
}

2.2 view层描述和具体代码

负责显示数据提供友好界面跟用户交互

package com.fw.mvp.mvp.view;

import com.fw.mvp.bean.Acount;

/**
 * description :View层接口,其具体实现类为MVPActivity
 * author : apple
 * date : 2021/6/16 11:03
 */
public interface IMVPView {
    /**
     * 获取输入内容
     *
     * @return
     */
    String getInputText();

    /**
     * 展示成功结果
     *
     * @param acount
     */
    void showSuccessPage(Acount acount);

    /**
     * 展示失败结果
     */
    void showFail();
}

package com.fw.mvp.mvp;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.fw.mvp.R;
import com.fw.mvp.bean.Acount;
import com.fw.mvp.mvp.presenter.IMVPPresenter;
import com.fw.mvp.mvp.presenter.MVPPresenter;
import com.fw.mvp.mvp.view.IMVPView;

/**
 * description :View层实现类
 * author : apple
 * date : 2021/6/15 21:04
 */
public class MVPActivity extends AppCompatActivity implements IMVPView, View.OnClickListener {

    private EditText editText;
    private Button button;
    private TextView textView;

    private IMVPPresenter mvpPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mvp);
        initView();
        initData();
    }

    private void initView() {
        editText = findViewById(R.id.et);
        button = findViewById(R.id.btn);
        textView = findViewById(R.id.tv);
    }

    private void initData() {
        button.setOnClickListener(this);
        mvpPresenter = new MVPPresenter(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn) {
            mvpPresenter.onClick(getInputText());
        }
    }

    @Override
    public String getInputText() {
        return editText.getText().toString().trim();
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void showSuccessPage(Acount acount) {
        textView.setText(acount.getName() + " | " + acount.getLevel());
    }

    @Override
    public void showFail() {
        textView.setText("数据获取失败");
    }
}

2.3 presenter层描述和具体代码

Presenter扮演着view和model的中间层的角色。

获取model层的数据之后构建view层;
也可以收到view层UI上的反馈命令后分发处理逻辑,交给model层做业务操作。

package com.fw.mvp.mvp.presenter;

/**
 * description :Presenter层接口
 * author : apple
 * date : 2021/6/16 15:24
 */
public interface IMVPPresenter {
    /**
     * 点击事件
     *
     * @param name
     */
    void onClick(String name);
}

package com.fw.mvp.mvp.presenter;

import com.fw.mvp.bean.Acount;
import com.fw.mvp.callback.MCallback;
import com.fw.mvp.mvp.model.IMVPModel;
import com.fw.mvp.mvp.model.MVPModel;
import com.fw.mvp.mvp.view.IMVPView;

/**
 * description :Presenter层实现
 * author : apple
 * date : 2021/6/16 11:11
 */
public class MVPPresenter implements IMVPPresenter {
    private IMVPView mView;
    private IMVPModel mModel;

    public MVPPresenter(IMVPView mView) {
        this.mView = mView;
        mModel = new MVPModel();
    }

    @Override
    public void onClick(String name) {
    	//调用model去进行逻辑处理
        mModel.getAcountData(name, new MCallback() {
            @Override
            public void onSuccess(Acount acount) {
            	//通知view层进行UI构建刷新
                mView.showSuccessPage(acount);
            }

            @Override
            public void onFail() {
            	//通知view层进行UI构建刷新
                mView.showFail();
            }
        });
    }
}

2.4 使用到的自定义的接口

package com.fw.mvp.callback;

import com.fw.mvp.bean.Acount;

/**
 * description :回调接口
 * author : apple
 * date : 2021/6/16 11:30
 */
public interface MCallback {
    void onSuccess(Acount acount);

    void onFail();
}


3. demo代码流程

3.1 代码流程

demo的代码流程:(请参考下面的类图)
1、 MVPActivity做了一些UI初始化的东西,需要实例化对应IMVPPresenter的引用,和实现 IMVPView的接口,监听界面动作;
2、 button按钮按下后出发点击事件,在onClick里接收到即通过MVPPresenter的引用把它交给MVPPresenter处理;
3、 然后MVPPresenter把逻辑交给Model层去处理,也就是这里面的MVPModel;
4、 MVPModel处理完逻辑之后,结果通过回调通知MVPPresenter;
5、MVPPresenter再把结果返回给View层的MVPActivity,最后MVPActivity显示结果。

3.2 代码流程图例

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值