您的位置:首页 > 移动开发 > Android开发

Android MVP设计模式的理解

2016-05-19 18:06 609 查看
做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如何更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: