zoukankan      html  css  js  c++  java
  • Android中MVP模式与MVC模式比較(含演示样例)

    原文链接 http://sparkyuan.me/ 转载请注明出处

    MVP

    介绍

    MVP模式(Model-View-Presenter)是MVC模式的一个衍生。

    主要目的是为了解耦,使项目易于维护。

    • Model 依旧是业务逻辑和实体模型
    • View 常常由Activity实现,包括Presenter的引用。所要做的就是当有交互时。调用Presenter里的相应方法。

    • Presenter 负责完毕View于Model间的交互。从Model里取数据,返回给View处理好的数据。

    为什么使用MVP

    在以往的Android开发中,Activity并非一个标准的MVC模式中的Controller, 它的载入应用的布局和初始化用户界面,接受并处理来自用户的操作请求,进而作出响应。可是随着界面及其逻辑的复杂度不断提升,Activity类的职责不断添加,以致变得庞大臃肿。当我们将当中复杂的逻辑处理移至另外的一个类(Presneter)中时,Activity事实上就是MVP模式中View。它负责UI元素的初始化,建立UI元素与Presenter的关联(Listener之类)。同一时候自己也会处理一些简单的逻辑(复杂的逻辑交由Presenter处理)。
    对于測试来说。在MVP模式中,处理复杂逻辑的Presenter是通过interface与View(Activity)进行交互的。

    我们能够通过自己定义类实现这个interface来模拟Activity的行为对Presenter进行单元測试。省去了大量的部署及測试的时间。

    MVC介绍

    • Model 是应用程序中用于处理应用程序数据逻辑的部分。

    • View 是应用程序中处理数据显示的部分。
    • Controller是应用程序中处理用户交互的部分。
      详细介绍请戳这里

    比較

    MVP模式:

    • View不直接与Model交互 。而是通过与Presenter交互来与Model间接交互
    • Presenter与View的交互是通过接口来进行的,更有利于加入单元測试
    • 通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑

    MVC模式:

    • View能够与Model直接交互
    • Controller是基于行为的,而且能够被多个View共享
    • 能够负责决定显示哪个View

    演示样例

    一个登陆注冊的样例。


    演示样例

    文件夹结构

    结构

    Model

    Model为User的信息,项目里省略了。当然你也能够新建一个User类

    public class UserBean {
       private String mFirstName ;
       private String mLastName ;
       public UserBean (String firstName, String lastName) {
         this .mFirstName = firstName;
         this .mLastName = lastName;
       }
       public String getFirstName() {
         return mFirstName ;
       }
       public String getLastName() {
         return mLastName ;
       }
    }

    View

    public class LoginActivity extends Activity implements LoginView, View.OnClickListener {
      private ProgressBar progressBar;
        private EditText username;
        private EditText password;
        private LoginPresenter presenter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
    
            progressBar = (ProgressBar) findViewById(R.id.progress);
            username = (EditText) findViewById(R.id.username);
            password = (EditText) findViewById(R.id.password);
            findViewById(R.id.button).setOnClickListener(this);
    
            presenter = new LoginPresenterImpl(this);
        }
    
        @Override public void onClick(View v) {
            presenter.validateCredentials(username.getText().toString(), password.getText().toString());
        }
        ...
        ...

    能够看到LoginActivity implements了两个接口。LoginView, View.OnClickListener。LoginView是在Presenter中用来与Activity通信的。在onClick()方法中调用了presenter进行事务处理。

    LoginView.java

    public interface LoginView {
        void showProgress();
    
        void hideProgress();
    
        void setUsernameError();
    
        void setPasswordError();
    
        void navigateToHome();
    }

    Presenter

    public class LoginPresenterImpl implements LoginPresenter, OnLoginFinishedListener {
    
        private LoginView loginView;
        private LoginInteractor loginInteractor;
    
        public LoginPresenterImpl(LoginView loginView) {
            this.loginView = loginView;
            this.loginInteractor = new LoginInteractorImpl();
        }
    
        @Override public void validateCredentials(String username, String password) {
            if (loginView != null) {
                loginView.showProgress();
            }
    
            loginInteractor.login(username, password, this);
        }
    
        @Override public void onUsernameError() {
            if (loginView != null) {
                loginView.setUsernameError();
                loginView.hideProgress();
            }
        }
        ...
        ...

    能够发现。在onUsernameError()方法中。把处理好的结果通过LoginView接口返还给Activity进行显示。


    到此为止。整个流程就跑通了。M存储数据,V交互。P处理逻辑。

    V和P之间通过接口通信。


    演示样例源代码戳这里

    原文链接 http://sparkyuan.me/ 转载请注明出处

  • 相关阅读:
    【前缀和】【分类讨论】hdu5163 Taking Bus
    【DFS】bzoj2079 [Poi2010]Guilds
    【贪心】bzoj3850 ZCC Loves Codefires
    【分类讨论】bzoj3856 Monster
    【莫队算法】【权值分块】bzoj2223 [Coci 2009]PATULJCI
    【枚举】bzoj1709 [Usaco2007 Oct]Super Paintball超级弹珠
    【矩阵哈希】【二分答案】【哈希表】bzoj1567 [JSOI2008]Blue Mary的战役地图
    【矩阵哈希】【哈希表】bzoj2351 [BeiJing2011]Matrix
    【哈希表】CODEVS1230 元素查找
    【二分答案】【哈希表】【字符串哈希】bzoj2946 [Poi2000]公共串
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7373243.html
Copyright © 2011-2022 走看看