MVC:
M:model,模型(业务逻辑):进行数据库的读写等等
V:view,视图(控件)等等:进行数据的显示
C:controller(控件的方法(界面逻辑),给model传递参数之类);
比如:你点个BUTTON,隐藏个控件,这个控件决定了model某个属性.如果隐藏这个方法是在view中写的,就是MVC,如果这个方法不是在View中写的就是MVP
其中:button是view,方法是controller.某个属性是model :但是button也可以直接在逻辑中设置属性,所以这样就会和model混淆;
View可以直接和model进行数据之间的传递,也可以通过controller传给model;
缺点就是:View和Model相互耦合,代码冗余;
MVP:
button是view,方法是controller.某个属性是model :但是view也可以直接设置业务逻辑(属性),所以这样就会和model混淆;
那MVP不让View和Model混在一起,而是通过Presenter层将他俩连接;
下面举个简单的连网络例子:
看下所谓的MVP:M,V,P层都由接口来进行和其他层的数据传递;
BaseView.java:
一共2个方法,注释很清晰,当然我们的view(activity)要实现这个接口
package app.project.mvp.view;
/**
* Created by QLY on 2016/8/31.
*
* UI逻辑接口,一般有activity、Fragment实现
*/
public interface BaseView {
/**
* 显示加载进度
*/
void loading();
/**
* 隐藏加载进度
*/
void cancelLoading();
}
BaseNet.java:
定义一个请求服务器的方法
package app.project.mvp.model;
/**
* Created by QLY on 2016/9/1.
*/
public interface BaseNet {
/**
* 请求服务器
*/
void RequestService();
}
BaseNetIml.java:
实现类
package app.project.mvp.model;
import android.util.Log;
/**
* Created by QLY on 2016/9/1.
*/
public class BaseNetIml implements BaseNet{
@Override
public void RequestService() {
Log.i("test", "RequestService: 请求服务器。。。");
}
}
BasePresenter .java:
package app.project.mvp.presenter;
/**
* Created by QLY on 2016/9/1.
* 页面业务逻辑(一般都要参与服务器交互)
*/
public interface BasePresenter {
/**
* 数据加载结果
*/
void loadResult();
}
PresenterIml.java
负责拿到BaseView 、BaseNet的引用,从而实现交互
package app.project.mvp.presenter;
import android.util.Log;
import app.project.mvp.model.BaseNet;
import app.project.mvp.model.BaseNetIml;
import app.project.mvp.view.BaseView;
/**
* Created by QLY on 2016/9/1.
*/
public class PresenterIml implements BasePresenter {
private BaseView mvpView;
private BaseNet baseNet;
public PresenterIml(BaseView mvpView) {
this.mvpView = mvpView;
baseNet = new BaseNetIml();
}
/**
* 加载数据
*/
public void loadData() {
mvpView.loading();
baseNet.RequestService();
}
@Override
public void loadResult() {
Log.i("test", "loadResult: 服务器返回结果。。。");
mvpView.cancelLoading();
}
}
接下来就是activity了:
package app.project.mvp.view;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.Random;
import app.project.R;
import app.project.mvp.presenter.BasePresenter;
import app.project.mvp.presenter.PresenterIml;
public class TestActivity extends AppCompatActivity implements BaseView {
private PresenterIml mPresenter;
boolean flag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
mPresenter = new PresenterIml(this);
//开始请求服务器
mPresenter.loadData();
//加载完成
mPresenter.loadResult();
}
@Override
public void loading() {
Log.i("test", "loading: 开始加载。。。");
}
@Override
public void cancelLoading() {
Log.i("test", "loading 加载完成。。。");
}
}