android MVC && MVP && MVVM分析和对比

一、介绍

  MVC,MVP和MVVM是软件比较常用的三种软件架构,这三种架构的目的都是分离关注,避免将过多的逻辑全部堆积在一个类中,以Android为例,在activity中既有UI的相关处理逻辑,又有数据获取逻辑,从而导致activity逻辑复杂不单一难以维护。为了一个应用可以更好的维护和扩展,我们需要很好的区分相关层级,要不然以后将数据获取方式从数据库变为网络获取时,我们需要去修改整个activity。架构使得view和数据相互独立,我们把应用分成三个不同层级,这样我们就能够单独测试相关层级,使用架构能够把大多数逻辑从activity中移除,方便进行单元测试。

二、MVC

2.1 简单介绍  

Model View Controller模式,MVC将应用分成三个主要层级:Model,View和Controller,它强制将逻辑进行分离,数据结构和Controller逻辑与UI是解耦的,所以测试相关模块变的更简单。 

其实android app的界面开发部分已经是遵从MVC模式的,

  • 视图层(View):主要包括一下View及ViewGroup控件,可以是系统控件也可以是自定义控件。
  • 控制层(Controller):Android的控制层的重任通常落在了众多的Activity的肩上,他们从模型层获取数据,将获取到的数据绑定到view上,并且还需要监听用户的输入等操作。
  • 模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算,变更等操作也是必须放在的该层的。

MVC模式具体表现在android上的效果如下图所示: 

2.2 实例讲解

以一个获取天气的例子来说,xml布局可视为View层;Activity为Controller层,控制用户输入,将Model层获取到的数据展示到View层;Model层的实体类当然就是用来获取网络数据了。

2.2.1 Model层

Model层处理所有的事件逻辑,最终将结果返回通过controller返回到view层。

1.首先定一个WeatherInfo用于存放天气对象的信息。

public class WeatherInfo {
    public String city;
    public double temp;
    public String WD;
    public String WS;
    public String time;
 //省略 getter 和setter方法

2.定义一个WeatherModel接口实现获取天气的方法

public interface WeatherModel {
    void getWeather(OnLoadWeatherCallback callback);
}

3.定义WeatherModelImpl具体实现WeaterModel接口中的方法

public class WeatherModelImpl implements WeatherModel {
private Context mContext;

public WeatherModelImpl(Context context) {
mContext = context;
}

@Override
public void getWeather(final OnLoadWeatherCallback callback) {//实现获取天气的方法并将加过通过回调返回给Controller

final String url = "http://www.weather.com.cn/data/sk/101010100.html";

if (isNetworkConnected(mContext)) {
new Thread(new Runnable() {
@Override
public void run() {
String netData = null;
netData = getNetWorkData(url);
Log.e("panzqww", "netData = "+netData);
if (!TextUtils.isEmpty(netData)) {
try {
JSONObject jsonObject = new JSONObject(netData);
jsonObject = new JSONObject(jsonObject.getString("weatherinfo"));
WeatherInfo info = new WeatherInfo();
info.setCity(jsonObject.getString("city"));
info.setTemp(Double.parseDouble(jsonObject.getString("temp")));
info.setWD(jsonObject.getString("WD"));
info.setWS(jsonObject.getString("WS"));
info.setTime(jsonObject.getString("time"));
callback.onLoadSuccess(info);//通过回调(监听事件)将info返回到Controller
} catch (JSONException e) {
e.printStackTrace();
} finally {
}
} else {
NetError error = new NetError();
error.errorCode = 405;
error.errorMessage = "获取数据为空!";
callback.onError(error);//通过回调(监听事件)将错误信息返回到Controller
}
}
}).start();


} else {
NetError error = new NetError();
error.errorCode = 404;
error.errorMessage = "网络开小差了,请检查网络";
callback.onError(error);
}
}

private String getNetWorkData(String path) {
String result = null;
try {
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//默认是get请求 如果想使用post必须指明
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);

int code = connection.getResponseCode();
if (code == 200) {
InputStream inputStream = connection.getInputStream();
//把数据流中的json数据 转换成字符串
ByteArrayOutputStream bos = new ByteArrayOutputStream();

int len = -1;
byte[] buff = new byte[1024];
while ((len = inputStream.read(buff)) != -1) {
bos.write(buff, 0, len);
}
result = new String(bos.toByteArray());

}

} catch (IOException e) {
e.printStackTrace();
} finally {
}

return result;
}

public boolean isNetworkConnected(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;
}
}

 4.定义一个回调接口 OnLoadWeatherCallback 处理获取天气接口返回到controller。

public interface OnLoadWeatherCallback {
    void onLoadSuccess(WeatherInfo info);
    void onError(NetError error);
}

猜你喜欢

转载自www.cnblogs.com/qiangge-python/p/9708256.html