传送门
MVC
结构简介
实例分析
Controller控制器式
点击(此处)折叠或打开
Model模型
点击(此处)折叠或打开
-
public interface WeatherModel {
-
void getWeatherData(String cityNumber, OnWeatherListener listener);
-
}
-
public class WeatherModelImpl implements WeatherModel {
-
-
-
@Override
-
public void getWeatherData(String cityNumber, final OnWeatherListener listener) {
-
-
-
/*数据层操作*/
-
VolleyRequest.newInstance().newGsonRequest(http:// + cityNumber + .html,
-
Weather.class, new Response.Listener() {
-
@Override
-
public void onResponse(Weather weather) {
-
if (weather != null) {
-
listener.onSuccess(weather);
-
} else {
-
listener.onError();
-
}
-
}
-
}, new Response.ErrorListener() {
-
@Override
-
public void onErrorResponse(VolleyError error) {
-
listener.onError();
-
}
-
});
-
}
-
-
public OnWeatherListener{
-
void onSuccess(Weather weather);
-
void onError();
-
}
-
}
总结
-
扩展性好、维护性、模块职责明确
-
耦合性低(解耦)、V和M非真正意义上的分离
什么时候适合使用MVC设计模式?
当一个小的项目且无需频繁修改需求就不用MVC框架来设计了,那样反而觉得代码过度设计,代码臃肿。一般在大的项目中,且业务逻辑处理复杂,页面显示比较多,需要模块化设计的项目使用MVC就有足够的优势了。
MVP
结构简介
为什么使用MVP模式
在Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,并接受并处理来自用户的操作请求,进而作出响应。随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。当我们将其中复杂的逻辑处理移至另外的一个类(Presneter)中时,Activity其实就是MVP模式中View,它负责UI元素的初始化,建立UI元素与Presenter的关联(Listener之类),同时自己也会处理一些简单的逻辑(复杂的逻辑交由Presenter处理).
另外,在MVP模式中,处理复杂逻辑的Presenter是通过interface与View(Activity)进行交互的,我们可以通过自定义类实现这个interface来模拟Activity的行为对Presenter进行单元测试,省去了大量的部署及测试的时间。
实例分析
MVP模式
View与Model并不直接交互,而是使用Presenter作为View与Model之间的桥梁。其中Presenter中同时持有Viwe层以及Model层的Interface的引用,而View层持有Presenter层Interface的引用。当View层某个界面需要展示某些数据的时候,首先会调用Presenter层的某个接口,然后Presenter层会调用Model层请求数据,当Model层数据加载成功之后会调用Presenter层的回调方法通知Presenter层数据加载完毕,最后Presenter层再调用View层的接口将加载后的数据展示给用户。这就是MVP模式的整个核心过程。
官方模式图
案例
我们将上边的例子改成MVP模式
WeatherModel不变
-
public interface WeatherModel {
-
-
void getWeatherData(String cityNumber, OnWeatherListener listener);
-
-
}
WeatherPresenter:只在view和model之间传递信息, 控制view的显示刷新等操作,不要做view的直接操作
我们需要根据业务需要定义接口,把view和model之间的关联进行描述
点击(此处)折叠或打开
-
public interface WeatherPresenter{
-
void getWeather(String cityNumber, OnWeatherListener listener);
-
}
WeatherView 所有跟view相关的操作都应该在这个子类里完成,这个类根据业务需要做了接口定义,抽出这一层的目的就是做单元测试的时候可以不创建具体的View
-
public interface WeatherView{
-
void showProgress();
-
void hideProgress();
-
-
-
void onSuccess(Weather weather);
-
void onError();
-
}
WeatherPresenterImpl
点击(此处)折叠或打开
-
public class WeatherPresenterImpl implements WeatherPresenter,WeatherModelImpl.OnWeatherListener{
-
private static final String TAG = "WeatherPresenterImpl";
-
private WeatherModel mModel;
-
private WeatherView mView;
-
-
-
public WeatherPresenterImpl(WeatherView view) {
-
this.mTopicModel = newWeatherModelImpl();
-
this.mView = view;
-
}
-
-
-
@Override
-
public void getWeather(String cityNumber, OnWeatherListener listener){
-
mView.showProgress();
-
mModel.getWeatherData(context, this);
-
}
-
-
-
@Override
-
public void onSuccess(Weather weather) {
-
mView.hideProgress();
-
mView.onSuccess(weather);
-
}
-
-
-
@Override
-
public void onError() {
-
mView.hideProgress();
-
mView.onError();
-
}
-
}
MainActivity :
点击(此处)折叠或打开
MVP与MVC的异同
MVC模式与MVP模式都作为用来分离UI层与业务层的一种开发模式被应用了很多年。在我们选择一种开发模式时,首先需要了解一下这种模式的利弊:
无论MVC或是MVP模式都不可避免地存如下弊端,这就导致了这两种开发模式也许并不是很小型应用。
但比起他们的优点,这点弊端基本可以忽略了:
-
降低耦合度
-
模块职责划分明显
-
利于测试驱动开发
-
代码复用
-
隐藏数据
-
代码灵活性
对于MVP与MVC这两种模式,它们之间也有很大的差异。以下是这两种模式之间最关键的差异:
MVP模式:
-
View不直接与Model交互,而是通过与Presenter交互来与Model间接交互
-
Presenter与View的交互是通过接口来进行的,更有利于添加单元测试
-
通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑
MVC模式:
-
View可以与Model直接交互
-
Controller是基于行为的,并且可以被多个View共享
-
可以负责决定显示哪个View
阅读(2562) | 评论(0) | 转发(0) |