关于MVP模式的使用设计

MVP设计模式对于Android开发已经越来越被人使用,M模型,V视图,P主持者,Presenter所扮演的角色就相当于连接M和V的桥梁。

P相当于JAVA设计模式中的一般的V是通过接口依赖注入,通过命令模式的方式进行,简单的理解命令模式就是使用接口的回调以达到对象方法的调用。命令模式在《JAVA设计模式》一书中解释为:涉及一个对象请求另一个对象调用其方法达到某种目的,但不希望或者无法含有被请求者的引用,即可使用命令模式。那么通过书中例子可以推断出这种调用模式就是利用接口回调。接口回调:实现某接口的类的引用赋给接口Variable,通过接口该变量调用所实现类的方法。Android中一些通信和View的事件响应也是回调接口的功劳。

故而Presenter中充当请求者,也就是回调的一般使用办法,将会包含一个接口的变量,一般通过依赖注入的方式将实现接口类引用赋值进来。而Presenter会在View中进行直接创建,它的使用维护都归此View管理。在Presenter中将会连接M层的逻辑处理。

但这样一般使用缺乏一些设计管理性。
那么下面给出一种对Presenter的管理设计方案:
首先定义一个需要被View实现的基础接口:

public interface MvpViewManager {
//    Object getChildMvpViewManager();
}

然后定义一个Presenter需要实现的用来注入View更新的接口引用的接口:

package presenter;

/**
 * Created by KUATANG on 2016/10/16.
 */
public interface PresenterInterface<T extends MvpViewManager>{
    void attachMvpViewManager(T mvpViewManager);
    void detachMvpViewManager();
    void configurationParamter(Object mObject);
}

定义一个Presenter的基类(抽象):

package presenter;

/**
 * Created by KUATANG on 2016/10/16.
 */
public abstract class Presenter<T extends MvpViewManager>
        implements PresenterInterface<T>{

    private T mvpViewManager;
    private Object mObject;

    @Override
    public void attachMvpViewManager(T mvpViewManager) {
        this.mvpViewManager = mvpViewManager;
    }

    @Override
    public void detachMvpViewManager() {
            mvpViewManager = null;
    }

    @Override
    public void configurationParamter(Object mObject) {
        this.mObject = mObject;
    }

    protected T getInstanceMvpViewManager(){
        return mvpViewManager;
    }

}

接下来就是使用上述接口了——
定义一个具体的View的更新接口:

package interfaceview;

import presenter.MvpViewManager;

/**
 * Created by KUATANG on 2016/10/16.
 */
public interface IFilePresenterView extends MvpViewManager{

    void updateTipToast();
}

注意:它继承自MvpViewManager接口。
查看它的实现:

package fragment;

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

import application.FragmentBasic;
import concretepresenter.FileListPresenter;
import interfaceview.IFilePresenterView;

/**
 * Created by KUATANG on 2016/10/16.
 */
public class FileListFragment extends FragmentBasic implements IFilePresenterView{

    private String paramArg0, paramArg1;
    private RecyclerView recyclerView;

    private FileListPresenter mFileListPresenter;

    public static FileListFragment newInstance(String paramArg0, int paramArg1){
        FileListFragment fileListFragment = new FileListFragment();
        Bundle mBundle = new Bundle();
        mBundle.putString("paramArg0", paramArg0);
        mBundle.putInt("paramArg1", paramArg1);
        fileListFragment.setArguments(mBundle);
        return fileListFragment;
    }


    public FileListFragment(){
        super();
        mFileListPresenter = new FileListPresenter();
        mFileListPresenter.attachMvpViewManager(this);
    }


    @Override
    public void updateTipToast() {

    }

    @Override
    public int getFragmentLayoutView() {
        return 0;
    }


    @Override
    protected void getArgumentsFromFragment() {
        super.getArgumentsFromFragment();
        if (getArguments() != null){
            Bundle _mBundle = getArguments();
            String _string_param = _mBundle.getString("paramArg0");
            int _int_param = _mBundle.getInt("paramArg1", 0);
        }
    }

    @Override
    protected void setInitMemberWidgets() {
        super.setInitMemberWidgets();
    }

    @Override
    protected void setInitMemberDataVariable() {
        super.setInitMemberDataVariable();
    }

    @Override
    protected void setInitOtherWorks() {
        super.setInitOtherWorks();
    }
}

FragmentBasic 作为Fragment的基类:

package application;

import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by KUATANG on 2016/10/16.
 */
public abstract class FragmentBasic extends Fragment implements IFragmentPosrtable{
    public Context context;
    protected View viewRoot;
    protected Boolean isShowFragment;
    public Activity activity;


    public FragmentBasic() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Boolean getIsShowFragment() {
        return isShowFragment;
    }

    public void setIsShowFragment(Boolean isShowFragment) {
        this.isShowFragment = isShowFragment;
    }

    public Context getContext() {
        return context;
    }

    public View getView() {
        return viewRoot;
    }

//    public void setView(View view) {
//        this.view = view;
//    }

    @Override
    public Context getActivityContext() {
        // TODO Auto-generated method stub
        context = getActivity();
        activity = getActivity();
        return context;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onAttach(Activity activity) {
        // TODO Auto-generated method stub
        super.onAttach(activity);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub
        super.onConfigurationChanged(newConfig);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        setIsShowFragment(false);
    }

    @Override
    public void onDestroyView() {
        // TODO Auto-generated method stub
        super.onDestroyView();
    }

    @Override
    public void onDetach() {
        // TODO Auto-generated method stub
        super.onDetach();
    }

    @Override
    public void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
    }

    @Override
    public void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        setIsShowFragment(true);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
    }

    @Override
    public void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        getArgumentsFromFragment();
        viewRoot = inflater.inflate(getFragmentLayoutView(), container, false);

        getActivityContext();
        setInitMemberWidgets();
        setInitMemberDataVariable();
        setInitOtherWorks();
        return viewRoot;
    }

    protected void getArgumentsFromFragment(){}

    protected void setInitMemberWidgets(){}
    protected void setInitMemberDataVariable(){}
    protected void setInitOtherWorks(){}

}

接下来查看该V对应的Presenter的实现,首先是它的接口:

package concretepresenter;

import interfaceview.IFilePresenterView;
import presenter.Presenter;

/**
 * Created by KUATANG on 2016/10/16.
 */
public class FileListPresenter extends Presenter<IFilePresenterView> implements FileInterface{



    @Override
    public void doAnalizingFileClassify() {

    }
}

该接口继承了Presenter,则说明将会注入IFilePresenterView接口从而回调更新UI,
它被FileListFragment实现,并且注入引用给对应的 mFileListPresenter.attachMvpViewManager(this);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值