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