Android MVP设计模式的理解

来源:互联网 发布:淘宝中药材哪家好知乎 编辑:程序博客网 时间:2024/05/15 06:14

        做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如何更新。

0 0
原创粉丝点击