Android MVP设计模式的理解

        做Android开发久了会有一种感觉,那就是业务逻辑总是伴随大量UI更新操作,最后我们的代码中UI更新伴随业务逻辑,业务逻辑发生伴随UI更新。如此纠缠,当一个类的代码越来越多的时候,过些日子再回头看,很乱很乱。作为一个长期运营的项目,这种做法是不可取的,当项目交到下一个人的手里,我只想说God will be with you. 所以从今以后,我们必须采取新的开发模式,尽管看起来繁琐一些,但是理解了思想就会发现你可以从业务逻辑和UI的纠缠中解放出来。

     先谈谈我个人对MVP模式的理解:服务端一般是MVC,其实两者名字不同,但相差并不大,核心的思想都是将业务逻辑同展现分离。隔离最好的方式就是使用接口,使得不同的组件依赖于抽象的接口,不依赖具体的实现,当修改代码的时候,由于接口不变,而我们的业务逻辑依赖于接口,因此得到了解放。

    活用MVP:并不是工程里一定要有M,但是V和P是一定要有的,P负责了业务逻辑的处理,并调用相应的更新UI的接口V,这里再次强调一下,业务逻辑是依赖于更新UI的抽象接口的。说的这么抽象,看个简单的例子。

这个例子模拟程序的启动页,当程序启动的时候去获取网络状态,显示进度条模拟更新数据,获取成功就跳到下一个activity并关闭进度条,获取失败就提示用户失败

新建一个Android工程,新建包com.model            com.model.impl        com.view               com.presenter

在com.model下建立一个接口INetConnect:

package com.model;

import android.content.Context;
/**
 * 负责获取网络状态的接口
 *
 */
public interface INetConnect {
    boolean isNetConnect( Context context);
}

在com.model.impl下建立一个INetConnect具体实现类INetConnectImpl:

package com.model.impl;

import com.model.INetConnect;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
 * 获取网络状态的一种实现方式
 *
 */
public class INetConnectImpl implements INetConnect {
    @Override
    public boolean isNetConnect(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context
                        .getSystemService(Context. CONNECTIVITY_SERVICE);
            NetworkInfo mNetworkInfo = mConnectivityManager
                          .getActiveNetworkInfo();
            if(mNetworkInfo != null) {
                 return mNetworkInfo.isAvailable();
            }
        }
        return false;
    }
}

接着在com.view下定义一组更新UI的接口ISplashView:

package com.view;

/**
 * 更新UI视图的接口,每个Activity一个这样的接口
 *
 */
public interface ISplashView {
   void showProcessBar();
   void hideProcessBar();
   void showNetError();
   void startNextActivity();
}

再编写我们的业务逻辑实现类SplashPresenter:

package com.presenter;

import com.model.INetConnect;
import com.model.impl.INetConnectImpl;
import com.view.ISplashView;

import android.content.Context;

/**
 * 我们的业务逻辑实现,这个过程调用的都是接口完成的,不依赖具体实现。
 * 每个Activity一个这样的Presenter
 *
 */
public class SplashPresenter {
   private INetConnect iCconnect;
   private ISplashView iView;

   public SplashPresenter(ISplashView iView){
       this.iView = iView;
       iCconnect = new INetConnectImpl();
   }

   public void didFinishLoading(Context context){
       iView.showProcessBar();
       if(iCconnect.isNetConnect(context)){
            iView.startNextActivity();
       } else{
            iView.showNetError();
       }
       iView.hideProcessBar();
   }
}


最后看一下我们的Activity:

package com.example.mvp;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.widget.Toast;

import com.presenter.SplashPresenter;
import com.view.ISplashView;
/**
 * MVP设计模式,最适合Android开发,再也不用担心业务逻辑和UI纠缠的太深了。
 * 我们的每个业务流程都可以用这个模型来表达,代码清晰可扩展。接口化为我们提供了约束,把UI操作和非UI操作隔离
 * @author zhangshiming
 *
 */
public class MainActivity extends Activity implements ISplashView{
	 /**负责根据Model接口获取数据,处理业务逻辑,并通过View来呈现。 我们的业务逻辑都写在这里**/
     private SplashPresenter mPresenter;
     private ProgressDialog mProgressBar;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout. activity_main);
         /**为ISplashView(更新UI)初始化具体实现类**/
         mPresenter = new SplashPresenter(this);
     }

     @Override
     protected void onResume() {
         super.onResume();
         /**执行我们的业务逻辑**/
         mPresenter.didFinishLoading(this);
     }

     /**
      * 以下4个方法为ISplashView具体实现
      */
     @Override
     public void showProcessBar() {
         if (mProgressBar == null) {
              mProgressBar = new ProgressDialog( this);
              mProgressBar.setCancelable( true);
              mProgressBar.setCanceledOnTouchOutside( true);
              mProgressBar.setMessage( "更新数据中,请稍后" );
         }
         mProgressBar.show();
     }

     @Override
     public void hideProcessBar() {
         mProgressBar.hide();
     }

     @Override
     public void showNetError() {
         Toast.makeText(this, "暂无网络", Toast.LENGTH_SHORT).show();
     }

     @Override
     public void startNextActivity() {
         Toast.makeText(this, "跳到下个activity", Toast.LENGTH_SHORT).show();
     }

}

好了,MVP的思想就是定义一组和UI更新相关的接口,并用presenter做业务逻辑处理,业务逻辑处理的只依赖于我们定义的接口,并不依赖具体UI如何更新。

猜你喜欢

转载自blog.csdn.net/mtaxot/article/details/51455959
今日推荐