您的位置:首页 > 运维架构 > 网站架构

浅谈MVC和MVP区别并附带mvp的demo(残缺的理解,非常抱歉)

2016-10-28 16:06 344 查看
这里所谈的都是基于android开发使用的架构模式
MVC:

首先来说说经常使用的mvc架构模式,mvc称为架构模式而不是设计模式,在安卓中mvc含有的设计模式有 观察者模式  策略模式  组合模式。而核心是观察者模式。
几乎google遍了相关的资料,最后我整理的总结如下:
MVC中的M(model)层,大多处理的是业务逻辑,比如网络操作,数据库操作等等,然后返回数据体的;V(view)层,在android中就是xml或者动态代码生成的布局,用来显示数据;C(controller)也就是控制中心,顾名思义就是控制数据通信,显示等操作,在android里面是activity。
其实对于android开发初学者而言,谈不上什么架构,就是知道拿到需求就是一直低头码,等发现一个acitivty里面的代码达到几千行的时候才发现想回头找到某个view,某个返回参数的时候是多么麻烦。所以就需要在开发之前就要进行项目架构设计,也就是常说的项目搭建,而第一次使用的,设置说早就使用但是没有在意过的mvc架构模式。在开发中,如果你抽取了一些工具类,并且在工具类里面进行的逻辑运算,那么这就是简单的涉及到mvc架构模式了,最简单的就是listview的数据显示,activity相当于controller,listview为view,adapter就是我们做业务逻辑的model,通过controller进行通信,实现显示和逻辑的分离,这就是简单的mvc实现。
mvc优点:
       1.mvc理解起来比较容易,技术含量相对来说不高,一般的项目维护起来简单
       2.耦合性相对于逻辑显示都在acitivity中来说是很低的。
       缺点:
       1.我们简单的使用mvc是足够的,但是要完全理解并透析它不是一个简单的事情,在代码编写之前我们就要对整体的代码架构有足够的了解,每次对每一个新的需求,或者一个新的工具类都要进行测试才能进行集成使用,这对应用的调试就有了一定的难度。
       2.对于一些小的项目来说,我说的小是指页面少,业务逻辑简单而言。使用mvc来说的话就有点”大材小用”了,(加引号的意思是还不够大材,都是相对而言罢了)。
那么mvc我开始真正的研究的时候是想多了,网上很多资料也把mvc和mvp弄的有点不分你我,而我们使用的时候明明是mvp却认为自己使用的是mvc。我现在理解,甚至可以说mvc是android应用中的framwork层自动生成或者说搭建的一个架构,M  V  C我们仅仅需要的是抽取出M罢了。(个人理解,欢迎讨论)
MVP:

mvc介绍完,可能就要介绍我正在使用的mvp了,对于mvp而言,我们知道的就是他是mvc的升级版,那么到底升级在了哪里了呢。就是一句话,他就是将mvc中的c的工作部分到p层去,那么这个部分工作到底是什么?就是“通信”!也就是mvc的c从v拿数据,再将数据传入到m中去。通信。而c中剩余的工作,在mvp中还是由activity进行了,就是真正的显示代码了。
那么MVP理论:
(1)Presenter – 交互中间人:Presenter主要作为沟通View与Model的桥梁,它从Model层检索数据后,返回给View层,使得View与Model之间没有耦合,也将业务逻辑从View角色上抽离出来。
(2)View – 用户界面:View通常是指Activity、Fragment或者某个View控件,它含有一个Presenter成员变量。通常View需要实现一个逻辑接口,将View上的操作转交给Presenter进行实现,最后,Presenter 调用View逻辑接口将结果返回给View元素。

(3)Model – 数据的存取:Model 角色主要是提供数据的存取功能。Presenter 需要通过Model层存储、获取数据,Model就像一个数据仓库。更直白的说,Model是封装了数据库DAO或者网络获取数据的角色,或者两种数据方式获取的集合。
MVP的优点:
     1.MVP有效的解除了view和model的耦合,有效的降低了view的复杂度(这句话我没理解透,欢迎指教),同时又带来了良好的可扩展性和可测试性,代码整洁和灵活。
     2.MVP模式可以分录显示层和逻辑层,他们之间通过接口进行通信,也就是p层,降低了耦合。理想化的MVP模式可以实现同一份的逻辑代码适用不同的显示界面,因为它们之间并不依赖于具体,而是依赖于抽象(这句话非常重要,认真理解)。这使得presenter可以适用于实现了view接口的所有UI,使之具有更强大的可扩展性和可侧耳实行。



mvc和mvp的区别,看到上图,直观的区别就是mvc中的model和view可以直接通信,我认为这是错的,他们是间接通信,注意!但是还是存在耦合的,那么mvp在这方面却能做到model和view不会出现耦合,他们之间是通过接口
进行调用,也就是我们说的p,那么没有p是不会存在互调关系的。这就是他们之间最直观的区别。那么在我们使用过程中,千万不要将两者混淆。

下面通过一个简单的demo进行解析。 

这是工程结构:

package xiaowu.mvptest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import xiaowu.mvptest.presenter.presenterImp;
import xiaowu.mvptest.view.EditView;

/**
* activity其实就是做了mvc中的c的部分中作,就是进行数据显示,别误会,这里的数据显示也不是它控制,它仅仅做了实现而已。
*/

public class MainActivity extends AppCompatActivity implements EditView{

private EditText edittext;
private Button clickon;
private xiaowu.mvptest.presenter.presenterImp presenterImp;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 在这里定义了model的成员变量,并且传入了对应的view接口
*/
presenterImp = new presenterImp(this);
initView();
clickon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**
* 调用了p层中的login,而对应的imp实现去进行model的工作,就是业务逻辑处理
*/
presenterImp.login();
}
});

}

private void initView() {
edittext = (EditText) findViewById(R.id.edittext);
clickon = (Button) findViewById(R.id.clickon);
}

/**
* 下面就是对应实现,就是editview接口里面的实现。
* @return
*/
@Override
public String  getUsername() {
return edittext.getText().toString();
}

@Override
public void onsuscess(String ss) {
Log.d("xiaowu","成功了"+ss);

}

@Override
public void onError() {
Log.d("xiaowu","失败了");
}
}


上面很简单注释已经很明白了,这里需要提醒的是,记住在activity中也就是c中进行接口实现并且进行真正的数据显示,还有是定义p接口进行model层调用。
package xiaowu.mvptest.presenter;

import android.text.TextUtils;

import xiaowu.mvptest.view.EditView;

/**
* Created by wzy on 16/10/24.
*/
public class presenterImp implements UserPresenter {

private final EditView mEditView;

/**
* 我们看到的就是通过接口进行数据通信,又通过接口将数据传到c中进行界面展示。接口 接口 接口  重要的事情说三遍
* @param editview
*/
public presenterImp(EditView editview){
mEditView = editview;
}
@Override
public void login() {
/**
* 下面就是通过接口获取到view中的数据进行逻辑处理
*/
String username = mEditView.getUsername();
/**
* 下面就是业务逻辑
*/
if(TextUtils.isEmpty(username)){
mEditView.onError();
}else{
mEditView.onsuscess(username);
}
}
}

package xiaowu.mvptest.presenter;

/**
* Created by wzy on 16/10/28.
*/
public interface UserPresenter {
void login();
}

package xiaowu.mvptest.view;

/**
* Created by wzy on 16/10/24.
*/
public interface EditView {
/**
* 这就是mvp固有的缺点,就是如果项目过小,那么我们实现这个mvp就要考虑到对应的view所能遇到的所有可能性,这就是
* 需要我们开发人员在编写代码初期就要进行整体思考,也就是架构搭建
* @return
*/
String getUsername() ;

void onsuscess(String ss);

void onError();

}


以上的运行效果我就不上图了,源码就这么几行,大家可以自己看着复制粘贴。
这里再次解释一下,多墨迹几句我对mvp的理解,mvp其实重点就是p层接口的定义和model的实现p里面的方法进行逻辑运算,这里的逻辑运算是对传入这里的数据,也就是在c中定义接口变量,然后传入的view接口,那么view接口里面的实现就在c中,调用过程就是
c中定义presenterimp对象,本身c实现viewinterface,传入到presenterimp对象,在presenterimp中通过实现viewinterface的接口方法获取数据,也就是在c中实现的,逻辑处理并进行方法调用。重点:(c定义,实现)<——>(pimp调用实现方法进行数据处理);这样大家就明白了吧,中间就是P!!!!!!
注:以上是调研了很多资料自己整理的感触,个人理解,轻喷,欢迎讨论。

感谢 点击打开链接  
感谢 点击打开链接
上面的两篇文章很好,大家看我写的不懂可以看看上面,互相对比就很好理解了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息