关于MVP模式的使用设计

来源:互联网 发布:mac版su破解教程 编辑:程序博客网 时间:2024/05/15 05:38

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);

0 0
原创粉丝点击