首页天道酬勤你是我的mvp什么意思,mvp形容人什么意思

你是我的mvp什么意思,mvp形容人什么意思

张世龙 05-04 03:58 54次浏览

前言今天记录自己对MVP模型的理解。

带着问题问,什么是MVP? 怎么做,作用是什么?

本文MVP的概念MVP全称是Model-View-Presenter,MVP是从经典模式MVC发展而来,它们的基本思想有共同之处:控制器/presenter负责逻辑处理,mooller/presenter

MVP的作用MVC和MVP都是软件设计的典范,遵循这个设计原则可以使我们的软件结构清晰,便于开发、维护和理解。

最终要达到的目的是降低耦合度,提高复用性。 了解MVC和MVP了解安卓MVC

安卓中MVC各部分的构成与分工

Model:数据层:提供数据

View:的各种视图或活动负责UI的显示

Controller :通常是Activity或Fragment,功能:简单摘要是处理业务逻辑(接收用户请求、处理用户交互、从视图读取数据、控制用户输入、演示)

对安卓MVP的理解

Model:数据层:提供数据

view :活动/框架负责显示UI

Presenter :抽象层负责视图与模型的交互,将视图与数据模型分开,从模型请求数据,将数据返回给视图看

MVC与MVP的比较在MVP中,视图(活动/框架)只进行展示,不包括业务逻辑。

View和Model也没有直接的联系,而是通过Presenter完成两者的联系,Presenter和View的交互通过接口完成,业务逻辑都通过Presenter完成

在MVC中,view和model可以直接交互,控制器基于行为,可以由多个view共享,根据逻辑决定展示哪个view。

结论: MVC和MVP通过一个业务逻辑、数据、接口分离的方法组织代码的MVC业务逻辑和展示都在活动中,活动庞大,可读性差。 MVP模式最好将业务隔离在Presenter层,可读性与MVC交叉。 实例应用简要介绍下MVP模式在安卓中的应用

业务不介绍,看图就能理解

业务代码:

/* * log inui * @ author admin */publicclassloginfragmentextendsbasefragmentimplementslogincontact.view,view.onclickliclion private Button loginBtn,registerBtn,thirdBtn,forgetBtn; publicstatictchecknotnull (t reference ) if ) reference==null ) { throw new NullPointerException; } else {返回参考; } publicloginfragment ((/emptyconstructorneeded ) publicstaticloginfragmentnewinstance ) { return new LoginFragment @ overridepublicvoidsetpresenter (@ nonnulllogincontact.presenter presenter ) mpresenter=checknotnull ) ) presenter; } @ overridepublicbooleanisactive () { return isAdded ); } @ overrideprotectedvoidonhandlemessage (消息msg ) } @ overrideprotectedviewcreatecontent ) layoutinflaterinflater, view bundlesavedinstancestate (returninflater.inflate ) r.layout.fragment_login,container,false ); } @ overrideprotectedvoidfindviews () { nameEditText=getView ).findviewbyid ) r.I

d.name); pwdEditText = getView().findViewById(R.id.passWord); loginBtn = getView().findViewById(R.id.login); registerBtn = getView().findViewById(R.id.register); thirdBtn = getView().findViewById(R.id.third); forgetBtn = getView().findViewById(R.id.forget); } @Override protected void initData() { //do request mPresenter.start(); } @Override protected void setListener() { loginBtn.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.login: //do login mPresenter .doLogin(); break; case R.id.register: //do register same as login break; case R.id.third: //do third same as login break; case R.id.forget: //do forget same as login break; default: break; } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); } @Override public void free() { // cancel request when activity is finished // mPresenter.cancelRequest(); } @Override public void loginOK() { //loginOK Toast.makeText(getActivity(),"登录成功",Toast.LENGTH_SHORT).show(); } @Override public void loginError() { //loginError Toast.makeText(getActivity(),"登录失败",Toast.LENGTH_SHORT).show(); }} /** * login biz * @author admin */public interface LoginContact { interface View extends BaseView<Presenter> { /** * loginOK */ void loginOK(); /** * loginError */ void loginError(); } interface Presenter extends BasePresenter { /** * do login */ void doLogin(); }} /** * loginPresenter do login biz * @author zj on 2017-11-17. */public class LoginPresenter implements LoginContact.Presenter { LoginContact.View loginView; private Context mContext; public LoginPresenter(@NonNull LoginContact.View view, Context context) { loginView = checkNotNull(view, "LoginContact View cannot be null!"); loginView.setPresenter(this); mContext = context; } @Override public void doLogin() { // String result = UserModel.doLogin(); if("200".equals(result)){ // login ok loginView.loginOK(); }else { //login error loginView.loginError(); } } @Override public void start() { //do something when needed }} Demo下载链接:[bczm](http://download.csdn.net/download/u011733020/10122716) Attention:使用MVP模式时,异步请求回来,记得判断当前Activity 是否被销毁,否则会崩溃android.view.WindowManager$BadTokenException,ViewRootImpl.java,android.view.ViewRootImpl,setView,640,android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@444628b8 is not valid, is your activity running? 扩展介绍MVVM

M-Model : 实体模型(biz/bean)
V-View : 布局文件(XML)
VM-ViewModel : DataBinding所在之处,对外暴露出公共属性,View和Model的绑定器

对比MVP和MVVM模型图可以看出,他们之间区别主要体现在以下两点:

可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多View重用这段视图逻辑。 在Android中,布局里可以进行一个视图逻辑,并且Model发生变化,View也随着发生变化。低耦合。以前Activity、Fragment中需要把数据填充到View,还要进行一些视图逻辑。现在这些都可在布局中完成(具体代码请看后面) 甚至都不需要再Activity、Fragment去findViewById()。这时候Activity、Fragment只需要做好的逻辑处理就可以了。

MVVM使用databinding的方式,databinding 书写相交当前习惯的书写方式
有些不同。

当前主流还是MVP,结合项目业务逻辑的复杂度,及大家的开发习惯,
转到MVP相对比较容易。

MVVM也是一种很好的架构,大家可以试着了解。

结语 理解有误的地方望道友不吝指导。 欢迎爱学习的小伙伴加群一起进步:230274309 。 一起分享,一起进步!少划水,多晒干货!!欢迎大家!!!(进群潜水者勿加)
最小可行性产品mvp 概念,mvp最小化可行产品例子