从简单MVP模式实现到MVP封装

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 13:55   11   0



由图可见MVC模式Model View Controller他们三者之间的关系是互相相通的 缺点就是:一旦一方改变就会牵连到另外一方,耦合度较高。MVP模式Model View Presenter他们三者之间关系都会经过Presenter,起到一个隔离数据的作用,分工更明确。

为什么要用MVP?

利于项目维护,代码结构更清晰。

MVP模式

MVC模式的结构分为三部分,实体层的Model,视图层的View,以及控制层的Presenter。

Model:层就是JavaBean实体类,用于保存实例数据和请求网络数据(耗时操作)

View:层其实就是程序的UI界面,用于向用户展示数据以及接收用户的输入

Presenter:控制器用于更新UI面和数据实例

MVP的实现

在项目中的结构图:

代码的实现

Model层:写一个接口进行回调数据

package com.mvpframework.activity.listpageactivity.entityclass;

import com.mvpframework.activity.listpageactivity.busentity.BusInfo;

import java.util.List;

/**
 * 请求网络数据
 */
public interface IPalmBusEntity {
    //获取数据
    void getData(PalmBusEntity.LoadDataCallback callback);
    void getBusInfo_new(String[]strings);
    interface LoadDataCallback {
        void getBusData(List<BusInfo>mList);
        void getBusInfo(String[]strings);
    }
}
进行Model的实际操作
package com.mvpframework.activity.listpageactivity.entityclass;

import android.util.Log;

import com.mvpframework.activity.listpageactivity.busentity.BusInfo;
import com.mvpframework.config.API;
import com.mvpframework.networkrequest.HttpCallBack;
import com.mvpframework.networkrequest.HttpProxy;

import java.util.HashMap;

/**
 * 公交站查询-请求数据层
 */
public class PalmBusEntity implements IPalmBusEntity {
    private HashMap<String, Object> params = new HashMap<>();
    private final static String APP_KEY = "";
    private String mStart,mStop;
    @Override
    public void getData(LoadDataCallback callback) {
        params.put("key", APP_KEY);
        params.put("city",mStart);
        params.put("bus", mStop);
        HttpProxy.obtain().post(API.BUS_QUERY, params, new HttpCallBack<String>() {
            @Override
            public void onFailure(String string) {
                Log.d("网络请求", "----------------------请求失败------------------");
            }

            @Override
            public void onSuccess(String busInfo) {
                StringBuffer stringBuffer = new StringBuffer();
                //if (busInfo != null) {
                    //stringBuffer.append(busInfo.getResult());
                    Log.d("网络请求", "-------------------请求成功------------------" + busInfo);
                //}
            }
        });
    }

    @Override
    public void getBusInfo_new(String[]strings) {
        for (int i=0;i<=strings.length;i++){
            mStart=strings[0];
            mStop=strings[1];
        }
    }
}

Presenter层负责View层和Model的数据交互
package com.mvpframework.activity.listpageactivity.presenter;

/**
 * 交互层
 */
public interface IPalmBusPresenter {
    void loadData();
}

Presenter实际操作

package com.mvpframework.activity.listpageactivity.presenter;

import com.mvpframework.activity.listpageactivity.busentity.BusInfo;
import com.mvpframework.activity.listpageactivity.entityclass.IPalmBusEntity;
import com.mvpframework.activity.listpageactivity.entityclass.PalmBusEntity;
import com.mvpframework.activity.listpageactivity.view.IPalmBusView;

import java.util.List;

/**
 * 公交站查询-数据交互层
 */
public class PalmBusPresenter implements IPalmBusPresenter{
    private IPalmBusEntity iPalmBusEntity=new PalmBusEntity();
    private IPalmBusView iPalmBusView;

    public PalmBusPresenter(IPalmBusView iPalmBusView){
        this.iPalmBusView=iPalmBusView;
    }
    public PalmBusPresenter(IPalmBusEntity iPalmBusEntity){
        this.iPalmBusEntity=iPalmBusEntity;
    }
    @Override
    public void loadData() {
        //显示查询到公交的结果
        if (iPalmBusEntity!=null){
            iPalmBusEntity.getData(new IPalmBusEntity.LoadDataCallback() {
                @Override
                public void getBusData(List<BusInfo> mList) {
                    iPalmBusView.showData(mList);
                }

                @Override
                public void getBusInfo(String[]strings) {
                    //从视图层获取到数据通过p层交互数据到m层
                    if (iPalmBusView!=null){
                        iPalmBusView.getShowBusData(strings);
                    }
                }
            });
        }
    }
}

View接口回到数据

package com.mvpframework.activity.listpageactivity.view;

import com.mvpframework.activity.listpageactivity.busentity.BusInfo;

import java.util.List;

/**
 *显示层
 */
public interface IPalmBusView {
    //显示数据
    void showData(List<BusInfo> mList);
    void getShowBusData(String[]strings);
}

View显示数据

package com.mvpframework.activity.listpageactivity.view;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.mvpframework.R;
import com.mvpframework.activity.listpageactivity.busentity.BusInfo;
import com.mvpframework.activity.listpageactivity.presenter.IPalmBusPresenter;
import com.mvpframework.activity.listpageactivity.presenter.PalmBusPresenter;

import java.util.List;

/**
 * 公交站查询-显示数据层
 */
public class PalmBusView extends Activity implements IPalmBusView {
    private IPalmBusPresenter iPalmBusPresenter;
    private EditText start, stop;
    private Button query;
    public String ed_start, ed_stop;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_palm_bus);
        init();
    }

    private void init() {
        //Presenter的实例
        start = (EditText) findViewById(R.id.start);
        stop = (EditText) findViewById(R.id.stop);
        query = (Button) findViewById(R.id.query);
        query.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                iPalmBusPresenter = new PalmBusPresenter(PalmBusView.this);
                iPalmBusPresenter.loadData();
                ed_start = start.getText().toString().trim();
                ed_stop = stop.getText().toString().trim();
            }
        });
    }

    //显示数据
    @Override
    public void showData(final List<BusInfo> mList) {

    }
    //从视图层传递数据到p层
    @Override
    public void getShowBusData(String[]strings) {
        if (strings==null){
            strings=new String[]{ed_start,ed_stop};
        }
    }
}

以上就是MVP的基本实现,但是在实际开发中这么写不的累死,对以上MVP进行进一步的封装:

首先把一直在做重复工作的抽出一个基类进行复用:

Activity基类:

package com.wj.mvp.base;

import android.app.Activity;
import android.os.Bundle;

/**
 * 基类
 */
public abstract class BaseActivity<V,T extends BasePresenter<V>> extends Activity{
    private static final String TAG = "BaseActivity";
    //交互层
    public T presenter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        presenter=createPresenter();
        //加载数据
        presenter.attachView((V)this);
    }

    protected abstract T createPresenter();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.detachView();
    }

}
Presenter基类
package com.wj.mvp.base;

import java.lang.ref.WeakReference;

/**
 * 交互层
 */
public class BasePresenter<T> {
    //获取到view层的引用
    protected WeakReference<T>mViewRef;
    //进行绑定
    public void attachView(T view){
        mViewRef=new WeakReference<T>(view);
    }
    //解绑
    public void detachView(){
        mViewRef.clear();
    }
}

Model层

package com.wj.mvp.view.customizedarea.model;

import com.wj.mvp.entity.CustomizedArea;

/**
 * 数据源
 */
public interface ICustomizedAreaModel {
    void getData(CustomizedAreaModel.getLoadData loadData);

    interface getLoadData {
        void onSuccess(CustomizedArea customizedArea);

        void onFail();
    }
}

package com.wj.mvp.view.customizedarea.model;

import android.util.Log;

import com.wj.mvp.config.ApiService;
import com.wj.mvp.entity.CustomizedArea;
import com.wj.mvp.network.OkHttpNetwork;
import com.wj.mvp.network.RetrofitHelper;

import java.util.HashMap;

import rx.Observable;

/**
 * 数据源
 */
public class CustomizedAreaModel implements ICustomizedAreaModel {
    private static final String TAG = "CustomizedAreaModel";
    HashMap<String, Object> map;
    @Override
    public void getData(final getLoadData loadData) {
        if (map==null){
            map=new HashMap<>();
            map.put("custom_hot",20);
            map.put("custom_post",20);
            map.put("custom_design",20);
        }
        Observable<CustomizedArea> observable = RetrofitHelper.getService(ApiService.class).getWorkSharing(map);
        OkHttpNetwork.doPostRequest(observable, new OkHttpNetwork.OnResultListener<CustomizedArea>() {
            @Override
            public void onSuccess(CustomizedArea customizedArea) {
                if (customizedArea.getStatus() == 200) {
                    Log.d(TAG, "onSuccess: ------------请求成功---------------");
                    loadData.onSuccess(customizedArea);
                }
            }

            @Override
            public void onError(Throwable error, String msg) {
                Log.d(TAG, "onError:  ---------------请求失败------------------");
            }
        });
    }
}
Presenter
package com.wj.mvp.view.customizedarea.presenter;

/**
 * 交互层
 */
public interface ICustomizedAreaPresenter {
    void getInteractive();
}



package com.wj.mvp.view.customizedarea.presenter;

import com.wj.mvp.base.BasePresenter;
import com.wj.mvp.entity.CustomizedArea;
import com.wj.mvp.view.customizedarea.activity.ICustomizedAreaActivity;
import com.wj.mvp.view.customizedarea.model.CustomizedAreaModel;
import com.wj.mvp.view.customizedarea.model.ICustomizedAreaModel;

/**
 * 交互层
 */
public class CustomizedAreaPresenter<T extends ICustomizedAreaActivity> extends BasePresenter<T>{
    private CustomizedAreaModel customizedAreaModel=new CustomizedAreaModel();

    public void getInteractive() {
        if (mViewRef.get()!=null){
            if (customizedAreaModel!=null){
                customizedAreaModel.getData(new ICustomizedAreaModel.getLoadData() {
                    @Override
                    public void onSuccess(CustomizedArea customizedArea) {
                        mViewRef.get().showData(customizedArea);
                    }

                    @Override
                    public void onFail() {

                    }
                });
            }
        }
    }
}

View层

package com.wj.mvp.view.customizedarea.activity;

import com.wj.mvp.entity.CustomizedArea;

/**
 * 定制专区
 */
public interface ICustomizedAreaActivity {
    void showData(CustomizedArea customizedArea);
}

package com.wj.mvp.view.customizedarea.activity;

import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;

import com.wj.mvp.R;
import com.wj.mvp.adapter.CustomizedAreaWorkSharing;
import com.wj.mvp.base.BaseActivity;
import com.wj.mvp.entity.CustomizedArea;
import com.wj.mvp.view.customizedarea.presenter.CustomizedAreaPresenter;

/**
 * 显示层
 */
public class CustomizedAreaActivity extends BaseActivity<ICustomizedAreaActivity, CustomizedAreaPresenter<ICustomizedAreaActivity>> implements ICustomizedAreaActivity {
    private RecyclerView mRecyclerView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_customized_area);
        mRecyclerView = (RecyclerView) findViewById(R.id.mRecyclerView_share);
        presenter.getInteractive();
    }

    @Override
    protected CustomizedAreaPresenter<ICustomizedAreaActivity> createPresenter() {
        return new CustomizedAreaPresenter<>();
    }

    @Override
    public void showData(CustomizedArea customizedArea) {
        mRecyclerView.setAdapter(new CustomizedAreaWorkSharing(CustomizedAreaActivity.this, customizedArea.getCustom_design()));
        mRecyclerView.setLayoutManager(new LinearLayoutManager(CustomizedAreaActivity.this, OrientationHelper.HORIZONTAL, false));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.detachView();
    }
}
希望对大家有所帮助!


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP