MVC和MVP

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  加载完成。。。");

    }

}

猜你喜欢

转载自blog.csdn.net/emmmsuperdan/article/details/82146168