浅谈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是不会存在互调关系的。这就是他们之间最直观的区别。那么在我们使用过程中,千万不要将两者混淆。
上面很简单注释已经很明白了,这里需要提醒的是,记住在activity中也就是c中进行接口实现并且进行真正的数据显示,还有是定义p接口进行model层调用。
以上的运行效果我就不上图了,源码就这么几行,大家可以自己看着复制粘贴。
这里再次解释一下,多墨迹几句我对mvp的理解,mvp其实重点就是p层接口的定义和model的实现p里面的方法进行逻辑运算,这里的逻辑运算是对传入这里的数据,也就是在c中定义接口变量,然后传入的view接口,那么view接口里面的实现就在c中,调用过程就是
c中定义presenterimp对象,本身c实现viewinterface,传入到presenterimp对象,在presenterimp中通过实现viewinterface的接口方法获取数据,也就是在c中实现的,逻辑处理并进行方法调用。重点:(c定义,实现)<——>(pimp调用实现方法进行数据处理);这样大家就明白了吧,中间就是P!!!!!!
注:以上是调研了很多资料自己整理的感触,个人理解,轻喷,欢迎讨论。
感谢 点击打开链接
感谢 点击打开链接
上面的两篇文章很好,大家看我写的不懂可以看看上面,互相对比就很好理解了。
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!!!!!!
注:以上是调研了很多资料自己整理的感触,个人理解,轻喷,欢迎讨论。
感谢 点击打开链接
感谢 点击打开链接
上面的两篇文章很好,大家看我写的不懂可以看看上面,互相对比就很好理解了。
相关文章推荐
- 一个demo理解什么是MVP
- 浅谈MVC与MVP的区别
- 理解MVC,MVP,MVVM设计模式的区别
- 关联--依赖、组合--聚合 的联系与区别(解释的非常容易理解)
- nio简单demo,帮助理解io与nio区别
- 浅谈MVC,MVP,MVVM区别联系
- MVP架构的理解与实现Demo
- 理解 JavaScript 中的策略模式(附带call()和apply()的区别)
- 从MVP登录Demo理解MVP模式
- Android MVP与MVC的区别和理解
- JAVA零基础自学笔记-JDBC篇 附带的小Demo 理解功能
- 关于strutsdemo实例的理解
- 理解构造器--构造器和方法的区别
- 深入理解sizeof与strlen的区别
- 理解error和exception之间的区别
- 转:理解error和exception之间的区别
- 理解构造器--构造器和方法的区别
- 理解面向对象和面向过程区别的一个小例子。
- 应用反编译命令JavaP理解String和StringBuffer的区别
- 如何理解JavaScript、Java、Jsp、J2ee之间的关系与区别