失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android中的MVP设计架构

Android中的MVP设计架构

时间:2019-09-27 15:31:19

相关推荐

Android中的MVP设计架构

Android中的MVP设计架构

MVP在Android开发中的应用,最核心的目的是为了解耦Activity或Fragment承载的繁杂逻辑。因为在Android体系架构的设计中,是允许Activity或Fragment中围绕View和Model发展出复杂逻辑代码,这样最终的结果——绝大多数情况下,几乎必然造成每一个Activity或Fragment非常臃肿。

MVP在Android架构设计中的核心思想:MVP在Android设计架构中,MVP把Activity或Fragment退化到仅仅承载View使用,不再在其体内展开逻辑和业务代码,把View和Model做两层解耦(Presenter层作为中间层转发这种解耦关系),View和Model之间的解耦较MVC设计模式更彻底。

在某种意义上讲,MVP并不是一种完全区别于MVC的全新设计模式,MVP是经典MVC模式的轻度“改进”,MVP把MVC原先各个模块(Model,View,Controller)的具体实现,进一步做了多层次的接口、模块抽象(从这个角度上讲,MVP和MVVM区别很大,MVVM更像是一种有别于MVC和MVP的新设计模式)。没有任何一种设计模式是完美的银弹,可以解决所有问题。MVP自身也存在问题,比如MVP在Android开发中至少有以下问题:

一、MVP容易发生内存泄露(多处持有Activity或Fragment的引用,对象之间引用关系更复杂,且层级较深)。

二、虽然实现了解耦,但代价就是在形式上必须产生出更多的Model、View和Presenter子类。

三、不同模块和类之间的不小心会互相嵌套调用链。

以用户登录过程为例。

抽象建模:

package zhangphil.pattern;/*** MVP中的M,Model**/public interface Model {boolean doLogin(String username, String password);}

package zhangphil.pattern;/*** MVP中的V,View*/public interface View {void showProgress(String s);void hideProgress(String s);void successs(String s);void faild(String s);}

package zhangphil.pattern;/*** MVP中的P,Presenter*/public interface Presenter {void login(String name, String password);void ok(String s);void error(String s);void show(String s);void hide(String s);}

模型实现:

package zhangphil.pattern;import java.util.Random;/*** 具体的登录业务逻辑模块代码落地实现。*/public class LoginModel implements Model {private int count = 1; //登录尝试计数器。private Presenter presenter;public LoginModel(Presenter presenter) {this.presenter = presenter;}/*** 这里是真正的登录过程落地实施。*/@Overridepublic boolean doLogin(String name, String password) {//模拟登录。//开始登录。presenter.show("开始登录...");boolean result = action();presenter.hide("登录结束");if (result) {presenter.ok(name + " 第" + count + "次 登录成功!");} else {presenter.error(name + " 第" + count + "次 录失败!");}count++; //每登录一次数计数加1。return result;}/*** 假设此处是具体的用户联网登录过程。** @return*/private boolean action() {Random random = new Random();boolean b = random.nextBoolean();return b;}}

package zhangphil.pattern;public class LoginPresenter implements Presenter {private final String TAG = getClass().getSimpleName();private View view;private Model model;public LoginPresenter(View view) {this.view = view;this.model = new LoginModel(this);}@Overridepublic void login(String name, String password) {//把登录任务转交专门的登录模块(Model)完成。model.doLogin(name, password);}@Overridepublic void ok(String s) {view.successs(s);}@Overridepublic void error(String s) {view.faild(s);}@Overridepublic void show(String s) {view.showProgress(s);}@Overridepublic void hide(String s) {view.hideProgress(s);}}

package zhangphil.pattern;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;public class MainActivity extends AppCompatActivity implements View {private TextView text;private Presenter presenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);presenter = new LoginPresenter(this);text = findViewById(R.id.text);findViewById(R.id.button).setOnClickListener(new android.view.View.OnClickListener() {@Overridepublic void onClick(android.view.View v) {presenter.login("zhangphil", "12345678");}});}@Overridepublic void showProgress(String s) {text.setText(text.getText() + "\n" + s);}@Overridepublic void hideProgress(String s) {text.setText(text.getText() + "\n" + s);}@Overridepublic void successs(String s) {text.setText(text.getText() + "\n" + s);}@Overridepublic void faild(String s) {text.setText(text.getText() + "\n" + s);}}

运行结果:

如果觉得《Android中的MVP设计架构》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。