mvp 订阅
美国职业篮球联赛最有价值球员奖(National Basketball Association Most Valuable Player Award ,简称MVP)是一个自1955-1956赛季以来每年对美国职业篮球联赛(NBA)常规赛中全场表现最佳的球员所颁发的一个奖项。为纪念NBA首位总裁莫里斯·波多罗夫,于是将MVP奖杯命名为“莫里斯·波多罗夫杯“。 展开全文
美国职业篮球联赛最有价值球员奖(National Basketball Association Most Valuable Player Award ,简称MVP)是一个自1955-1956赛季以来每年对美国职业篮球联赛(NBA)常规赛中全场表现最佳的球员所颁发的一个奖项。为纪念NBA首位总裁莫里斯·波多罗夫,于是将MVP奖杯命名为“莫里斯·波多罗夫杯“。
信息
外文名
National Basketball Association Most Valuable Player Award
奖杯名称
莫里斯·波多罗夫杯
出    处
NBA
中文名
美国职业篮球联赛最有价值球员奖
开始时间
1955-56赛季
美国职业篮球联赛最有价值球员奖奖项信息
NBA常规赛结束后就会进行最有价值球员(MVP)的投票评选工作。直到1979-1980赛季,最初的MVP奖项都是由NBA球员投票评选出的。然而从1980-1981赛季开始,由美国和加拿大的体育记者和电视评论员投票决定MVP奖项的最终归属。每一位评委分别投票选出自己心目中最好的第一到第五位的球员。球员每获得一张第一位的选票将获得10分,第二位选票获得7分,第三位选票获得5分,第四位选票3分,第五位选票获得1分。从2010年开始,将有一张选票是由球迷通过网络投票评选出的,得票最多的球员将获得这张选票。 [1]  入选奈·史密斯篮球名人纪念堂的卡里姆·阿布杜尔-贾巴尔曾6次获得这一奖项。 [2]  比尔·拉塞尔和迈克尔·乔丹均5次获得该奖, [1]  而威尔特·张伯伦、勒布朗·詹姆斯则4次获得该奖。另外,名人堂球员摩西·马龙、拉里·伯德和埃尔文·约翰逊(“魔术师”约翰逊)都3次获得该奖;鲍勃·佩蒂特、卡尔·马龙、史蒂夫·纳什、蒂姆·邓肯、斯蒂芬·库里均2次斩获该奖项。 [1]  2014年NBA最有价值球员奖授予了凯文·杜兰特,他获得了125张第一名选票中的119张。 [3]  2016年斯蒂芬·库里成为NBA历史上首个全票当选MVP的球员。只有两位球员在新秀赛季就拿到了这个奖,分别是1959-1960赛季的威尔特·张伯伦,1968-1969赛季的韦斯·昂塞尔德。 [4]  获得该奖而非美国出生的球员有尼日利亚的哈基姆·奥拉朱旺 [5]  、美属维尔京群岛的蒂姆·邓肯、加拿大的史蒂夫·纳什 [6]  、德国的德克·诺维茨基、希腊的扬尼斯·安特托昆博。邓肯其实是美国公民,不过由于他并不是在美国的50个州或者华盛顿出生,所以他被看作是一名国际球员。比尔.拉塞尔,威尔特.张伯伦,拉里.伯德都曾连续三年获得MVP奖项。
收起全文
精华内容
下载资源
问答
  • MVP

    千次阅读 2017-06-09 13:56:53
    1.MVP是由MVC演化而来 2.MVP与MVC的区别 在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据...

    6.1.MVP是由MVC演化而来
    2.MVP与MVC的区别
    在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。
    这里写图片描述

    3.MVP优点
    模型与视图完全分离,我们可以修改视图而不影响模型
    可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部
    我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
    如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)

    4.MVP缺点
    由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁。还有一点需要明白,如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了。比如说,原本用来呈现Html的Presenter现在也需要用于呈现Pdf了,那么视图很有可能也需要变更。

    5.MVP如何解决MVC的问题?
    在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变,即重用! 不仅如此,我们还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试–而不需要使用自动化的测试工具。 我们甚至可以在Model和View都没有完成时候,就可以通过编写Mock Object(即实现了Model和View的接口,但没有具体的内容的)来测试Presenter的逻辑。 在MVP里,应用程序的逻辑主要在Presenter来实现,其中的View是很薄的一层。因此就有人提出了Presenter First的设计模式,就是根据User Story来首先设计和开发Presenter。在这个过程中,View是很简单的,能够把信息显示清楚就可以了。在后面,根据需要再随便更改View,而对Presenter没有任何的影响了。 如果要实现的UI比较复杂,而且相关的显示逻辑还跟Model有关系,就可以在View和Presenter之间放置一个Adapter。由这个 Adapter来访问Model和View,避免两者之间的关联。而同时,因为Adapter实现了View的接口,从而可以保证与Presenter之间接口的不变。这样就可以保证View和Presenter之间接口的简洁,又不失去UI的灵活性。 在MVP模式里,View只应该有简单的Set/Get的方法,用户输入和设置界面显示的内容,除此就不应该有更多的内容,绝不容许直接访问Model–这就是与MVC很大的不同之处。

    6.总结
    各部分之间的通信,都是双向的。
    View 与 Model 不发生联系,都通过 Presenter 传递。
    View 非常薄,不部署任何业务逻辑,称为”被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。
    参考http://baike.baidu.com/link?url=KHzm79SwEdU1jaRhApinnBvSKZufB2JKZtf4wyomdqAxNCugyombVVYVwdc6C-oqCW3m6Q9YcrLBrO45szn14vGTlw9Hix40WUR6hj2m0nu

    展开全文
  • 浅谈 MVP in Android

    万次阅读 多人点赞 2015-06-23 09:11:49
    对于MVP(Model View Presenter),大多数人都能说出一二:“MVC的演化版本”,“让Model和View完全解耦”等等。本篇博文仅是为了做下记录,提出一些自己的看法,和帮助大家如何针对一个Activity页面去编写针对MVP...

    转载请标明出处:
    http://blog.csdn.net/lmj623565791/article/details/46596109
    本文出自:【张鸿洋的博客】

    一、概述

    对于MVP(Model View Presenter),大多数人都能说出一二:“MVC的演化版本”,“让Model和View完全解耦”等等。本篇博文仅是为了做下记录,提出一些自己的看法,和帮助大家如何针对一个Activity页面去编写针对MVP风格的代码。

    对于MVP,我的内心有一个问题:

    为何这个模式出来后,就能被广大的Android的程序员接受呢?

    问了些程序员,他们对于MVP的普遍的认识是:“代码很清晰,不过增加了很多类”。我在第一次看到MVP的时候,看了一个demo,看完以后觉得非常nice(但是回过头来,自己想个例子写,就头疼写不出来,当然这在后文会说)。nice的原因还是因为,这个模式的确让代码的清晰度有了很大的提升。

    那么,提升一般都是对比出来的,回顾下,没有应用MVP的代码结构。很多人说明显是MVC么:

    • View:对应于布局文件
    • Model:业务逻辑和实体模型
    • Controllor:对应于Activity

    看起来的确像那么回事,但是细细的想想这个View对应于布局文件,其实能做的事情特别少,实际上关于该布局文件中的数据绑定的操作,事件处理的代码都在Activity中,造成了Activity既像View又像Controller(当然了Data-Binder的出现,可能会让View更像View吧)。这可能也就是为何,在该文中有一句这样的话:

    Most of the modern Android applications just use View-Model architecture,everything is connected with Activity.

    而当将架构改为MVP以后,Presenter的出现,将Actvity视为View层,Presenter负责完成View层与Model层的交互。现在是这样的:

    • View 对应于Activity,负责View的绘制以及与用户交互
    • Model 依然是业务逻辑和实体模型
    • Presenter 负责完成View于Model间的交互

    ok,先简单了解下,文中会有例子到时候可以直观的感受下。

    小总结下,也就是说,之所以让人觉得耳目一新,是因为这次的跳跃是从并不标准的MVCMVP的一个转变,减少了Activity的职责,简化了Activity中的代码,将复杂的逻辑代码提取到了Presenter中进行处理。与之对应的好处就是,耦合度更低,更方便的进行测试。借用两张图(出自:该文),代表上述的转变:

    转变为:

    二、MVP 与 MVC 区别

    ok,上面说了一堆理论,下面我们还是需要看一看MVC与MVP的一个区别,请看下图(来自:本文):

    其实最明显的区别就是,MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的(代码中会体现)。

    还有一堆概念性的东西,以及优点就略了,有兴趣自行百度。下面还是通过一些简单的需求来展示如何编写MVP的demo。

    三、Simple Login Demo

    效果图:

    看到这样的效果,先看下完工后的项目结构:

    ok,接下来开始一步一步的编写思路。

    (一)Model

    首先实体类User不用考虑这个肯定有,其次从效果图可以看到至少有一个业务方法login(),这两点没什么难度,我们首先完成:

    package com.zhy.blogcodes.mvp.bean;
    
    /**
     * Created by zhy on 15/6/18.
     */
    public class User
    {
        private String username ;
        private String password ;
    
        public String getUsername()
        {
            return username;
        }
    
        public void setUsername(String username)
        {
            this.username = username;
        }
    
        public String getPassword()
        {
            return password;
        }
    
        public void setPassword(String password)
        {
            this.password = password;
        }
    }
    
    
    package com.zhy.blogcodes.mvp.biz;
    
    /**
     * Created by zhy on 15/6/19.
     */
    public interface IUserBiz
    {
        public void login(String username, String password, OnLoginListener loginListener);
    }
    
    
    
    package com.zhy.blogcodes.mvp.biz;
    
    import com.zhy.blogcodes.mvp.bean.User;
    
    /**
     * Created by zhy on 15/6/19.
     */
    public class UserBiz implements IUserBiz
    {
    
        @Override
        public void login(final String username, final String password, final OnLoginListener loginListener)
        {
            //模拟子线程耗时操作
            new Thread()
            {
                @Override
                public void run()
                {
                    try
                    {
                        Thread.sleep(2000);
                    } catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                    //模拟登录成功
                    if ("zhy".equals(username) && "123".equals(password))
                    {
                        User user = new User();
                        user.setUsername(username);
                        user.setPassword(password);
                        loginListener.loginSuccess(user);
                    } else
                    {
                        loginListener.loginFailed();
                    }
                }
            }.start();
        }
    }
    
    
    package com.zhy.blogcodes.mvp.biz;
    
    import com.zhy.blogcodes.mvp.bean.User;
    
    /**
     * Created by zhy on 15/6/19.
     */
    public interface OnLoginListener
    {
        void loginSuccess(User user);
    
        void loginFailed();
    }
    
    

    实体类不用说,至于业务类,我们抽取了一个接口,一个实现类这也很常见~~login方法,一般肯定是连接服务器的,是个耗时操作,所以我们开辟了子线程,Thread.sleep(2000)模拟了耗时,由于是耗时操作,所以我们通过一个回调接口来通知登录的状态。

    其实这里还是比较好写的,因为和传统写法没区别。

    (二) View

    上面我们说过,Presenter与View交互是通过接口。所以我们这里需要定义一个ILoginView,难点就在于应该有哪些方法,我们看一眼效果图:

    可以看到我们有两个按钮,一个是login,一个是clear;

    login说明了要有用户名、密码,那么对应两个方法:

    
        String getUserName();
    
        String getPassword();

    再者login是个耗时操作,我们需要给用户一个友好的提示,一般就是操作ProgressBar,所以再两个:

        void showLoading();
    
        void hideLoading();

    login当然存在登录成功与失败的处理,我们主要看成功我们是跳转Activity,而失败可能是去给个提醒:

        void toMainActivity(User user);
    
        void showFailedError();

    ok,login这个方法我们分析完了~~还剩个clear那就简单了:

        void clearUserName();
    
        void clearPassword();

    综上,接口完整为:

    package com.zhy.blogcodes.mvp.view;
    
    import com.zhy.blogcodes.mvp.bean.User;
    
    /**
     * Created by zhy on 15/6/19.
     */
    public interface IUserLoginView
    {
        String getUserName();
    
        String getPassword();
    
        void clearUserName();
    
        void clearPassword();
    
        void showLoading();
    
        void hideLoading();
    
        void toMainActivity(User user);
    
        void showFailedError();
    
    }

    有了接口,实现就太好写了~~~

    总结下,对于View的接口,去观察功能上的操作,然后考虑:

    • 该操作需要什么?(getUserName, getPassword)
    • 该操作的结果,对应的反馈?(toMainActivity, showFailedError)
    • 该操作过程中对应的友好的交互?(showLoading, hideLoading)

    下面贴一下我们的View的实现类,哈,其实就是Activity,文章开始就说过,MVP中的View其实就是Activity。

    package com.zhy.blogcodes.mvp;
    
    import android.os.Bundle;
    import android.support.v7.app.ActionBarActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ProgressBar;
    import android.widget.Toast;
    
    import com.zhy.blogcodes.R;
    import com.zhy.blogcodes.mvp.bean.User;
    import com.zhy.blogcodes.mvp.presenter.UserLoginPresenter;
    import com.zhy.blogcodes.mvp.view.IUserLoginView;
    
    public class UserLoginActivity extends ActionBarActivity implements IUserLoginView
    {
    
    
        private EditText mEtUsername, mEtPassword;
        private Button mBtnLogin, mBtnClear;
        private ProgressBar mPbLoading;
    
        private UserLoginPresenter mUserLoginPresenter = new UserLoginPresenter(this);
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_user_login);
    
            initViews();
        }
    
        private void initViews()
        {
            mEtUsername = (EditText) findViewById(R.id.id_et_username);
            mEtPassword = (EditText) findViewById(R.id.id_et_password);
    
            mBtnClear = (Button) findViewById(R.id.id_btn_clear);
            mBtnLogin = (Button) findViewById(R.id.id_btn_login);
    
            mPbLoading = (ProgressBar) findViewById(R.id.id_pb_loading);
    
            mBtnLogin.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    mUserLoginPresenter.login();
                }
            });
    
            mBtnClear.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    mUserLoginPresenter.clear();
                }
            });
        }
    
    
        @Override
        public String getUserName()
        {
            return mEtUsername.getText().toString();
        }
    
        @Override
        public String getPassword()
        {
            return mEtPassword.getText().toString();
        }
    
        @Override
        public void clearUserName()
        {
            mEtUsername.setText("");
        }
    
        @Override
        public void clearPassword()
        {
            mEtPassword.setText("");
        }
    
        @Override
        public void showLoading()
        {
            mPbLoading.setVisibility(View.VISIBLE);
        }
    
        @Override
        public void hideLoading()
        {
            mPbLoading.setVisibility(View.GONE);
        }
    
        @Override
        public void toMainActivity(User user)
        {
            Toast.makeText(this, user.getUsername() +
                    " login success , to MainActivity", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void showFailedError()
        {
            Toast.makeText(this,
                    "login failed", Toast.LENGTH_SHORT).show();
        }
    }

    对于在Activity中实现我们上述定义的接口,是一件很容易的事,毕竟接口引导我们去完成。

    最后看我们的Presenter。

    (三)Presenter

    Presenter是用作Model和View之间交互的桥梁,那么应该有什么方法呢?

    其实也是主要看该功能有什么操作,比如本例,两个操作:login和clear。

    package com.zhy.blogcodes.mvp.presenter;
    
    import android.os.Handler;
    
    import com.zhy.blogcodes.mvp.bean.User;
    import com.zhy.blogcodes.mvp.biz.IUserBiz;
    import com.zhy.blogcodes.mvp.biz.OnLoginListener;
    import com.zhy.blogcodes.mvp.biz.UserBiz;
    import com.zhy.blogcodes.mvp.view.IUserLoginView;
    
    
    /**
     * Created by zhy on 15/6/19.
     */
    public class UserLoginPresenter
    {
        private IUserBiz userBiz;
        private IUserLoginView userLoginView;
        private Handler mHandler = new Handler();
    
        public UserLoginPresenter(IUserLoginView userLoginView)
        {
            this.userLoginView = userLoginView;
            this.userBiz = new UserBiz();
        }
    
        public void login()
        {
            userLoginView.showLoading();
            userBiz.login(userLoginView.getUserName(), userLoginView.getPassword(), new OnLoginListener()
            {
                @Override
                public void loginSuccess(final User user)
                {
                    //需要在UI线程执行
                    mHandler.post(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            userLoginView.toMainActivity(user);
                            userLoginView.hideLoading();
                        }
                    });
    
                }
    
                @Override
                public void loginFailed()
                {
                    //需要在UI线程执行
                    mHandler.post(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            userLoginView.showFailedError();
                            userLoginView.hideLoading();
                        }
                    });
    
                }
            });
        }
    
        public void clear()
        {
            userLoginView.clearUserName();
            userLoginView.clearPassword();
        }
    
    
    
    }
    

    注意上述代码,我们的presenter完成二者的交互,那么肯定需要二者的实现类。大致就是从View中获取需要的参数,交给Model去执行业务方法,执行的过程中需要的反馈,以及结果,再让View进行做对应的显示。

    ok,拿到一个例子经过上述的分解基本就能完成。以上纯属个人见解,欢迎讨论和吐槽~ have a nice day ~。

    源码点击下载

    微信公众号:hongyangAndroid
    (欢迎关注,第一时间推送博文信息)

    参考资料

    展开全文
  • mvp-源码

    2021-03-31 04:37:20
    MVP
  • MVP-源码

    2021-03-25 15:47:22
    MVP
  • 谈谈mvp见解

    2017-05-08 17:57:15
    mvp
  • android mvp

    2018-04-10 13:44:27
    android mvpandroid mvpandroid mvpandroid mvpandroid mvpandroid mvpandroid mvpandroid mvpandroid mvpandroid mvp
  • Android MVP

    2017-10-22 14:14:24
    Android MVP Android MVP Android MVP Android MVP Android MVP
  • MVPDemo:MVP演示-源码

    2021-05-13 02:50:14
    MVPDemo 一个简单的MVP登录demo 体会到了MVP的好处
  • mvp最简易版
  • androidMVP

    2016-04-30 11:52:39
    androidMVP
  • mvp:Android MVP工具-源码

    2021-05-10 06:12:18
    MVP 这是一个Android MVP示例。 用法 添加依赖项 compile 'me.sfce:mvp:2.1.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.7.0'
  • mvp:PopulStay MVP-源码

    2021-04-30 22:13:47
    PopulStay MVP 这是PopulStay的MVP。 项目概况 PopulStay是一个点对点的家庭共享网络 核心技术 如果您是该领域的新手,先熟悉一些核心技术可能会有所帮助 在本地安装和运行Demo DApp 确保您具有8.5.0或更高版本的...
  • ios-MVP.zip

    2019-07-11 19:05:00
    MVP
  • mvp helper

    2018-12-14 16:10:38
    可以用于android studio 基于activity和fragment 一键生成mvp相关的代码和文件夹。
  • MVP 任何图书馆的MVP
  • MVP 模型视图演示器 Android 示例
  • MVP框架

    2021-04-05 23:18:13
    作者SuperMan42,源码MVP,本项目本着简洁的思想,让开发更加简单,抽取出了core做为库,可以直接引入进行快捷开发,项目仍在改进中,如果有好的建议或者发现什么问题欢迎[issue]...email,如果感觉对你有帮助也欢迎点...
  • nubraclub-mvp Nibraclub的MVP
  • Android mvp

    2016-08-06 18:20:34
    浅谈android mvp
  • MoraGame+mvp

    2017-11-01 18:04:43
    mvp封装mvp封装mvp封装mvp封装mvp封装mvp封装mvp封装mvp封装mvp封装mvp封装
  • Quee MVP建筑师。 要使用此版本: 将此添加到build.gradle文件 repositories { maven { url "https://dl.bintray.com/quee/mvp-architecture" } } 然后在您的项目中添加此依赖项。 implementation 'io.quee....
  • MVPMVP“最有希望获得最佳MVP”之“最有希望获得最佳MVP”之“最有希望获得最佳MVP”之“最有希望获得最佳MVP”之“最佳MVP”之“最佳MVP”之“最佳MVP”之“最佳MVP”之“最佳MVP”之“最佳MVP”之“最佳MVP”...
  • Hive-MVP:蜂巢MVP-源码

    2021-04-01 23:20:12
    蜂巢MVP Hive MVP-使用Java Spring Boot和React的医师协作环境
  • 从认识mvp模式,学习,开始使用mvp模式到现在也有一年多的时间了。这一年时间里,无论是自己要做一些Android的小玩意还是做项目,最先考虑的就是要不要用mvp模式开发。学了这么久的MVP模式,这次趁现在还有点空余时间...
  • androidmvp

    2016-05-04 20:39:50
    android mvp模式实现demo
  • MVPDemo 只是mvp框架的演示

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,936
精华内容 33,574
关键字:

mvp