android mvp模式缺点,Android MVP开发模式的结构及优缺点详解

Android MVP开发模式的结构及优缺点详解

2018-12-13

在android开发中,有各种各样的开发模式,但遇到大型项目开发时,熟悉android的朋友都会推荐MVP开发模式。那MVP开发模式到底是什么,有什么优点呢?

1、android MVP开发模式的概念

Android的MVP是由MVC优化衍生出来的一种模式,MVP将MVC中的Controller层进行了优化而生成了Presenter。Presenter层和MVC的Controller一样,负责核心逻辑,但不一样的是Presenter通过接口协议进行数据传递,并阻断了View和Model的直接联系,从而使View和Model更加专注于自身业务逻辑。

2、android MVP开发模式的结构

67482231_1.png

View

View通常来说就是由Activity、Fragment实现的,View会包含一个或多个Presenter的引用来满足视图的业务逻辑。View和Presenter的交互是双向的,即View层可以调用Presenter的逻辑方法,Presenter也可以控制View的显示。

Presenter

Presenter作为Model和View的桥梁,负责从Model拿到数据进行处理并返回给View。但Presenter和其他两层的沟通是通过接口协议进行的,所以每个Presenter中通常会包涵一个或多个接口协议。

Model

和MVC一样,作为数据仓库只负责对APP数据进行处理。

在Android开发MVP模式实践中的示例,又将APP分为了以下四层:

67482231_2.png

Entities:APP中的业务类。

Use Cases:负责从将Entities中的数据进行处理和包装。

Presenters:从Use Cases获取处理好的数据,然后根据需求逻辑为UI提供合适的数据。

UI:从Presenters获取处理好的最终数据,和用户进行直接交互。

这四层设计的原则是代码调用只能从外圆向内圆扩展,内圆不能干预也不需关心外圆的功能逻辑,符合MVP的思想,Use Cases和Presenters将Entities和UI间隔分离,从而使Entities和UI只需关心自身逻辑,数据处理完全交给其他两层。

这里大家可能会有一些疑惑,为什么会有Use Cases?Presenter层自身的构架,因为仅仅套用MVP模式,虽然在一定程度上降低View的耦合度,但因为Presenter既要处理数据,又要结合需求控制UI交互,所以很可能出现Presenter逻辑的冗余。而在Presenter和Model之间包装了Use Cases,将数据逻辑处理交给UseCases,就可以保证Presenter更专心于UI交互。

3、android MVP开发模式的优点

1)View和Model之间的耦合度降低,使其更关注自身业务逻辑,结构清晰,维护方便;

2)便于单元测试;

3) 代码复用率提高;

4)代码框架更适用于快速迭代开发;

4、android MVP开发模式的缺点

任何开发模式都是有利也有弊的,毕竟世间完美的事物还是少见的。上面提到了MVP模式的有点,那就不得不说其还存在的缺点,或者说不足更准确吧。

MVP模式的不足,主要表现在每个view都有presenter ,类相对比较多。

以上就是android MVP开发模式的结构及优缺点,综合优缺点,优点还是远远大于缺点的,在android大型项目中,MVP开发模式还是很值得使用的。

相关文章:《Android内核开发之repo的常用命令大全》

文章来源:csdn

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。

http://www.pinlue.com/style/images/nopic.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的Android MVP架构模式实现的登录功能的示例代码: 1. 首先定义一个登录的接口 LoginContract,其中包括视图层、控制层和数据层的接口: ``` public interface LoginContract { interface View { void onLoginSuccess(); void onLoginFailure(String errorMessage); } interface Presenter { void login(String username, String password); } interface Model { void login(String username, String password, OnLoginFinishedListener listener); } interface OnLoginFinishedListener { void onLoginSuccess(); void onLoginFailure(String errorMessage); } } ``` 2. 在视图层,实现LoginContract.View接口,并创建Presenter对象: ``` public class LoginActivity extends AppCompatActivity implements LoginContract.View { private EditText mUsernameEditText; private EditText mPasswordEditText; private Button mLoginButton; private ProgressBar mProgressBar; private LoginContract.Presenter mPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); mUsernameEditText = findViewById(R.id.username_edit_text); mPasswordEditText = findViewById(R.id.password_edit_text); mLoginButton = findViewById(R.id.login_button); mProgressBar = findViewById(R.id.progress_bar); mPresenter = new LoginPresenter(this); mLoginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String username = mUsernameEditText.getText().toString(); String password = mPasswordEditText.getText().toString(); mPresenter.login(username, password); } }); } @Override public void onLoginSuccess() { // 登录成功 mProgressBar.setVisibility(View.GONE); Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(this, MainActivity.class); startActivity(intent); finish(); } @Override public void onLoginFailure(String errorMessage) { // 登录失败 mProgressBar.setVisibility(View.GONE); Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT).show(); } } ``` 3. 在控制层,实现LoginContract.Presenter接口,并通过构造函数将视图层和数据层传递进来: ``` public class LoginPresenter implements LoginContract.Presenter, LoginContract.OnLoginFinishedListener { private LoginContract.View mView; private LoginContract.Model mModel; public LoginPresenter(LoginContract.View view) { mView = view; mModel = new LoginModel(); } @Override public void login(String username, String password) { mView.showProgressBar(); mModel.login(username, password, this); } @Override public void onLoginSuccess() { mView.hideProgressBar(); mView.onLoginSuccess(); } @Override public void onLoginFailure(String errorMessage) { mView.hideProgressBar(); mView.onLoginFailure(errorMessage); } } ``` 4. 在数据层,实现LoginContract.Model接口,并在登录完成后将结果回调给Presenter: ``` public class LoginModel implements LoginContract.Model { @Override public void login(final String username, final String password, final LoginContract.OnLoginFinishedListener listener) { // 模拟登录过程,这里使用Handler模拟异步请求 new Handler().postDelayed(new Runnable() { @Override public void run() { if (username.equals("admin") && password.equals("123456")) { listener.onLoginSuccess(); } else { listener.onLoginFailure("用户名或密码错误"); } } }, 2000); } } ``` 这就是一个简单的Android MVP架构模式实现的登录功能的示例代码,通过这种架构模式,可以将代码分层,实现逻辑清晰,易于维护和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值