MVP

MVP 全称:Model-View-Presenter ;MVP 是从经典的模式 MVC 演变而来,它们的基本思想有相通的地方:Controller/Presenter 负责逻辑的处理,Model 提供数据,View 负责显示。

设计图

优点

1、M 与 V 完全分离,降低了耦合。
2、可以更高效地使用 Model,因为所有的交互都发生在 Presenter 内部。
3、(Presener的复用)一个Presener可以用于多个视图(View),而不需要改变 Presenter 的逻辑。视图(View)的变化比模型(Model)的变化更频繁的多 ,所以这样超级方便。
4、(View的复用)View可以进行组件化。在 MVP 当中,View 不依赖 Model。这样就可以让View 从特定的业务场景中脱离出来,可以说 View 可以做到对业务逻辑完全无知。它只需要提供一系列接口提供给上层操作。这样就可以做高度可复用的 View 组件。
5、更容易单元测试。

缺点

1、由于对视图的渲染放在了 Presenter 中,所以视图 View 和 Presenter 的交互会过于频繁。特别是需要修改视图的时候,Presenter 也需要跟着修改,很麻烦。
2、Presenter 中除了业务逻辑以外,还有大量的 View->Model,Model->View 的手动同步逻辑,造成 Presenter 比较笨重,维护起来会比较困难。
3、其实总的来说就是结构很清晰,业务逻辑也很明白,耦合低,但是就是自己写的麻烦, Presenter 不好维护,工作量太大,太笨重,有点像MVC中的Activity了,职责太多了。

实例

1. 效果图

2. 代码
LoginInteractor.java

public class LoginInteractor {private Handler mHandler = new Handler();interface OnLoginFinishedListener{void onUsernameError();void onPasswordError();void onSuccess();}public void login(final String username, final String password, final OnLoginFinishedListener listener) {mHandler.postDelayed(new Runnable() {@Overridepublic void run() {if (TextUtils.isEmpty(username)) {listener.onUsernameError();return;}if (TextUtils.isEmpty(password)) {listener.onPasswordError();return;}listener.onSuccess();}},2000);}
}

LoginView.java (V)

/*** Created on 2019/4/1 16:08** @author Gong*/
public interface LoginView {void showProgress();void hideProgress();void setUserNameError();void setPasswordError();void navigateToHome();
}

LoginPresenter.java §

public class LoginPresenter implements LoginInteractor.OnLoginFinishedListener {private LoginView mLoginView;private LoginInteractor mLoginInteractor;public LoginPresenter(LoginView loginView,LoginInteractor loginInteractor) {this.mLoginView = loginView;this.mLoginInteractor = loginInteractor;}public void validateCredentials(String username,String password) {if (mLoginView != null) {mLoginView.showProgress();}mLoginInteractor.login(username,password,this);}public void onDestroy() {mLoginView = null;}@Overridepublic void onUsernameError() {if (mLoginView != null) {mLoginView.setUserNameError();mLoginView.hideProgress();}}@Overridepublic void onPasswordError() {if (mLoginView != null) {mLoginView.setPasswordError();mLoginView.hideProgress();}}@Overridepublic void onSuccess() {if (mLoginView != null) {mLoginView.navigateToHome();}}
}

LoginActivity.java (M)

public class LoginActivity extends AppCompatActivity implements LoginView {private ProgressBar mProgressBar;private EditText mUserName,mPassword;private LoginPresenter mPresenter;private Button mLogin;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);initView();mPresenter = new LoginPresenter(this,new LoginInteractor());mLogin.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {validateCredentials();}});}private void initView() {mPassword = findViewById(R.id.password);mUserName = findViewById(R.id.username);mProgressBar = findViewById(R.id.progress);mLogin = findViewById(R.id.login);}private void validateCredentials() {mPresenter.validateCredentials(mUserName.getText().toString(),mPassword.getText().toString());}@Overridepublic void showProgress() {mProgressBar.setVisibility(View.VISIBLE);}@Overridepublic void hideProgress() {mProgressBar.setVisibility(View.GONE);}@Overridepublic void setUserNameError() {mUserName.setError(getString(R.string.user_name_error));}@Overridepublic void setPasswordError() {mPassword.setError(getString(R.string.password_error));}@Overridepublic void navigateToHome() {Intent intent = new Intent(LoginActivity.this, MainActivity.class);startActivity(intent);finish();}@Overrideprotected void onDestroy() {mPresenter.onDestroy();super.onDestroy();}
}

ic_username.xml

<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24dp" android:tint="#666666"android:viewportHeight="24.0" android:viewportWidth="24.0"android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"><path android:fillColor="#FF000000" android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
</vector>

ic_password.xml

<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24dp" android:tint="#666666"android:viewportHeight="24.0" android:viewportWidth="24.0"android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"><path android:fillColor="#FF000000" android:pathData="M12.65,10C11.83,7.67 9.61,6 7,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6c2.61,0 4.83,-1.67 5.65,-4H17v4h4v-4h2v-4H12.65zM7,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z"/>
</vector>

strings.xml

    <string name="user_name">请输入用户名</string><string name="password">请输入密码</string><string name="log_in">登录</string><string name="user_name_error">用户名输入错误</string><string name="password_error">密码输入错误</string>

activity_login.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="250dp"android:layout_height="match_parent"android:layout_gravity="center_horizontal"android:layout_marginTop="16dp"android:gravity="center"android:orientation="vertical"><EditTextandroid:id="@+id/username"android:layout_width="match_parent"android:layout_height="wrap_content"android:drawablePadding="8dp"android:drawableStart="@drawable/ic_username"android:gravity="center_vertical"android:hint="@string/user_name"android:inputType="text"android:drawableLeft="@drawable/ic_username" /><EditTextandroid:id="@+id/password"android:layout_width="match_parent"android:layout_height="wrap_content"android:drawablePadding="8dp"android:drawableStart="@drawable/ic_password"android:gravity="center_vertical"android:hint="@string/password"android:inputType="textPassword"android:drawableLeft="@drawable/ic_password" /><Buttonandroid:id="@+id/login"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/log_in" /><ProgressBarandroid:id="@+id/progress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="8dp"android:visibility="gone" /></LinearLayout>

【Android -- 架构】MVP 模式相关推荐

  1. Android之MVP模式

    今天来看看Android的MVP模式,使用框架开发,开发速度以及代码的目录结构会别有一番风格. Google的demo:https://github.com/googlesamples/android ...

  2. android 适合mvp模式,Android中的MVP:如何使Presenter层系统化?

    MVP(Model View Presenter)模式是著名的 MVC(Model View Controller)的衍生物,并且是 Android 应用程序中管理表示层的***的模式之一. 这篇文章 ...

  3. Android开发MVP模式--项目实战

    1 前言 苏宁+App是苏宁易购集团零售云研发中心分销研发中心主要产品之一,由于项目处于初期阶段,业务逻辑复杂,导致业务需求变动快,常常在开发甚至测试过程中出现界面或者后台接口调整的情况. App客户 ...

  4. Android之MVP 模式:简单易懂的介绍方式

    转载:https://segmentfault.com/a/1190000003927200 Android MVP Pattern Android MVP 模式1 也不是什么新鲜的东西了,我在自己的 ...

  5. ym——Android开发MVP模式(解决了View和Model的耦合)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 什么是MVP呢?它又和我们常常听到的MVC有什么关系了以及区别呢? MVP 是从经典的 ...

  6. Android开发MVP模式(解决了View和Model的耦合)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 什么是MVP呢?它又和我们常常听到的MVC有什么关系了以及区别呢? MVP 是从经典的 ...

  7. android 的MVP模式的介绍

    当下开发中使用最多的最普遍的有三种模式就是MVC,MVP和MVVM.相信大家对这三个名词并不陌生,他们在我们的开发用应用的及其广泛,今天我就浅谈一下我了解的MVP设计模式.说MVP之前不得不谈谈MVC ...

  8. 浅谈Android中MVP模式用于实际项目中的问题与优化

    学习MVP不算久,前段时间才把公司的两个项目完全转换为MVP模式,改了下来,略有心得,给大家分享一下. 才开始学习使用MVP时,看到大家说了很多MVP的优点,代码复用,条理清晰等等.不过我改下来发现, ...

  9. android MVP连接服务器,Android之MVP模式实现登陆和网络数据加载

    MVP简介 相信你们对 MVC 都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP做为MVC的演化版本,也是做为用户界面(用户层)的实现模式,那么相似的 ...

  10. Flutter Candies 一桶天下,一个小例子彻底搞懂Android的MVP模式到底是什么

    | | | | | ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2lt ...

最新文章

  1. 为什么不建议把数据库部署在Docker容器内
  2. 怎样做反向域名解析?
  3. 为什么产品经理总在焦虑
  4. iOS学习系列 - 标签Tag列表的实现
  5. Visual C++——定时刷新重绘窗口[WM_PAINT消息]解决方案
  6. php代码编辑器6,优秀的PHP代码编辑器_Blumentals Rapid PHP V13.6 免费版
  7. 用strtotime()和date()函数算出2019年9月的周日日期
  8. Java队列Disruptor 的使用
  9. 1.13_bucket_sort_桶排序
  10. 新阁上位机开发---数据库系统之sa账户登录失败
  11. 【C++】struct结构体/构造函数
  12. i5 10500h和i5 10300h有什么区别i510500h和i510300h差距大不大
  13. MPB:南农韦中组-植物根际土壤样品的非破坏性连续采集
  14. UGUI Text行首标点处理
  15. AIT Worldwide Logistics与卡利塔航空建立民航预备队合作伙伴关系
  16. mysql select into
  17. XNA学习笔记(5)-调节刷新率(framerate)
  18. 操作系统真象还原 第一章
  19. 基于Java的QQ屏幕截图工具的设计与实现(论文+PPT+源码)
  20. 敏捷 冲刺_敏捷团队实现冲刺承诺的5种方式

热门文章

  1. 修改ipa文件版本号
  2. FX系列DSZR回原点指令结束后M8029不亮的解决方案
  3. The day that you see me old
  4. linux中bash是什么命令,linux中bash是什么意思?
  5. 如果360与QQ冲突下去不兼容,你会放弃哪一个?
  6. springboot jedis配置以及集群(第三篇) ubuntu16实现redis集群
  7. Codewars | 使用入门
  8. 华为手机浏览器 onclick失灵的问题
  9. 手机浏览器部分不支持8位rgba色值
  10. EDG:相信奇迹的人,本身就是奇迹。