MVP模式的简单理解
2016-10-14 17:16
381 查看
这几天一直加班,好不容易到了周末,就狂睡一通,结果白天睡觉,晚上反而睡不着了。闲着也么事,就起来写写博客吧,记录一下最近工作中遇到的问题。
刚进新公司的时候,接手了公司的项目,可是刚拿到代码就蒙了,完全看不懂。。。新公司用的是MVP架构,但是我之前的公司用的是MVC架构,有的人可能就会问了,为了么MVP架构这么流行,还有公司不去用它,这个我也没办法,也不是我们今天讨论的话题。
拿着公司的代码,边做功能边学习MVP,这个还是比较痛苦的,刚开始什么都看不懂,方法在哪里被调用的也看不出来,只能慢慢摸索,好在这两天的努力没白费,终于把MVP弄懂了,下面我就以我的思路来解释一下什么叫MVP。
我们就写一个简单的Demo吧,从实例中来学习比较快。网上大部分的MVP例子都是登录注册,我也来写一个登录注册。
首先,我们需要定义一个资源文件
代码很简单,一个账号输入框,一个密码输入框,一个登录按钮
然后看一下,不使用MVP模式的MainActivity代码:
前面的都不用看,直接看onClick()方法里面,大家有没有看到,case R.id.login_btn后面的代码有点多,有的人就问啦,不是很多啦,也就十几行。对,也就十几行,但是正式的公司项目中是不可能只有一个点击事件的,也就是switch语句里面会有很多case语句,到时候修改代码的时候可以把你烦死,一个switch块就有几百行几千行代码,会疯掉的~~~
发火
反正我看到这种代码就没好心情了
下面我们稍微改进一下,让代码简洁一些,请看我是如何修改的:
其他代码都没有变,我只是把登录事件封装到一个方法体里面了,这样封装一下,会很好理解,代码也就简洁了些。但是现在还有一个问题,如果点击事件很多,你必须要给每个点击事件封装一个方法,夸张点说,如果有100个点击事件,那我岂不是要在MainActivity里面封装100个方法吗?其实挺心疼MainActivity的,一个大姑娘家的,既要处理View层,又要处理业务逻辑层,把管家的事情都做了,能不憔悴吗,能有人喜欢吗
于是MVP架构就出现了,就是为了解决MainActivity大妹子的烦恼,首先我们需要定义一个接口,接口干嘛用的???(握了棵草,也不讲讲清楚,上来就接口!!!)没关系,我在代码中给你注释了,不怕你看不懂
然后我们让MainActivity实现这个接口
看到没有,我们的大妹子在onclick点击事件里面让自己的管家来处理登录事件,而自己只需要关心有没有登录成功,这样就显得轻松许多
我们看看大管家是怎么来做事情的
大管家会处理登录事件,然后把处理结果告诉大妹子,让大妹子根据不同的结果来进行不同的操作
刚进新公司的时候,接手了公司的项目,可是刚拿到代码就蒙了,完全看不懂。。。新公司用的是MVP架构,但是我之前的公司用的是MVC架构,有的人可能就会问了,为了么MVP架构这么流行,还有公司不去用它,这个我也没办法,也不是我们今天讨论的话题。
拿着公司的代码,边做功能边学习MVP,这个还是比较痛苦的,刚开始什么都看不懂,方法在哪里被调用的也看不出来,只能慢慢摸索,好在这两天的努力没白费,终于把MVP弄懂了,下面我就以我的思路来解释一下什么叫MVP。
我们就写一个简单的Demo吧,从实例中来学习比较快。网上大部分的MVP例子都是登录注册,我也来写一个登录注册。
首先,我们需要定义一个资源文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/username_et" android:hint="请输入账号" android:layout_width="match_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/password_et" android:hint="请输入密码" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword" /> <Button android:id="@+id/login_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录"/> </LinearLayout>
代码很简单,一个账号输入框,一个密码输入框,一个登录按钮
然后看一下,不使用MVP模式的MainActivity代码:
public class MainActivity extends Activity implements OnClickListener { private static final String TAG = "MainActivity"; public static final String USERNAME="wuzhanglao"; public static final String PASSWORD="470782682"; private EditText username_et; private EditText password_et; private Button login_btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { username_et = (EditText) findViewById(R.id.username_et); password_et = (EditText) findViewById(R.id.password_et); login_btn = (Button) findViewById(R.id.login_btn); login_btn.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.login_btn: String username = username_et.getText().toString(); String password = password_et.getText().toString(); if(username.isEmpty() || password.isEmpty()){ Log.d(TAG, "账号或者密码不能为空"); } else if(username.length() <8 || password.length()<9){ Log.d(TAG, "账号至少8位,密码至少10位"); } else if(username.equals(USERNAME)){ if(password.endsWith(PASSWORD)){ Log.d(TAG, "恭喜你,登录成功"); } else { Log.d(TAG, "登录失败->密码错误"); } } break; } } }
前面的都不用看,直接看onClick()方法里面,大家有没有看到,case R.id.login_btn后面的代码有点多,有的人就问啦,不是很多啦,也就十几行。对,也就十几行,但是正式的公司项目中是不可能只有一个点击事件的,也就是switch语句里面会有很多case语句,到时候修改代码的时候可以把你烦死,一个switch块就有几百行几千行代码,会疯掉的~~~
发火
反正我看到这种代码就没好心情了
下面我们稍微改进一下,让代码简洁一些,请看我是如何修改的:
@Override public void onClick(View v) { switch (v.getId()) { case R.id.login_btn: //把登录事件封装成了一个方法,直接调用就行了,代码看起来简洁而且容易理解 LoginEvent(); break; } } private void LoginEvent() { String username = username_et.getText().toString(); String password = password_et.getText().toString(); if (username.isEmpty() || password.isEmpty()) { Log.d(TAG, "账号或者密码不能为空"); } else if (username.length() < 8 || password.length() < 9) { Log.d(TAG, "账号至少8位,密码至少10位"); } else if (username.equals(USERNAME)) { if (password.endsWith(PASSWORD)) { Log.d(TAG, "恭喜你,登录成功"); } else { Log.d(TAG, "登录失败->密码错误"); } } }
其他代码都没有变,我只是把登录事件封装到一个方法体里面了,这样封装一下,会很好理解,代码也就简洁了些。但是现在还有一个问题,如果点击事件很多,你必须要给每个点击事件封装一个方法,夸张点说,如果有100个点击事件,那我岂不是要在MainActivity里面封装100个方法吗?其实挺心疼MainActivity的,一个大姑娘家的,既要处理View层,又要处理业务逻辑层,把管家的事情都做了,能不憔悴吗,能有人喜欢吗
于是MVP架构就出现了,就是为了解决MainActivity大妹子的烦恼,首先我们需要定义一个接口,接口干嘛用的???(握了棵草,也不讲讲清楚,上来就接口!!!)没关系,我在代码中给你注释了,不怕你看不懂
public interface IMainView { //如果登录成功,管家会拨打这个电话(接口) void LoginSuccess(); //如果登录失败,管家会拨打这个电话(接口),并告诉MainActivity大妹子为什么登录失败 void LoginFailed(String msg); }
然后我们让MainActivity实现这个接口
public class MainActivity extends Activity implements OnClickListener, IMainView { private static final String TAG = "MainActivity"; public static final String USERNAME = "wuzhanglao"; public static final String PASSWORD = "470782682"; private EditText username_et; private EditText password_et; private Button login_btn; private MainPresenter mainPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { username_et = (EditText) findViewById(R.id.username_et); password_et = (EditText) findViewById(R.id.password_et); login_btn = (Button) findViewById(R.id.login_btn); login_btn.setOnClickListener(this); //雇一个叫main的管家,然后把自己登录成功和登录失败的联系方式给他 //如果登录成功,管家会拨打loginSuccess这个电话 //如果登录失败,管家会拨打logniFailed(String msg)这个电话 mainPresenter = new MainPresenter(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.login_btn: String username = username_et.getText().toString(); String password = password_et.getText().toString(); // 让自己的管家去处理登录事件 mainPresenter.login(username, password); break; } } @Override public void LoginSuccess() { Log.d(TAG, "管家打电话过来说:登录成功"); } @Override public void LoginFailed(String msg) { Log.e(TAG, "管家打电话过来说:登录失败,失败原因:" + msg); } }
看到没有,我们的大妹子在onclick点击事件里面让自己的管家来处理登录事件,而自己只需要关心有没有登录成功,这样就显得轻松许多
我们看看大管家是怎么来做事情的
//MainActivity的管家 public class MainPresenter { private static final String TAG = "MainPresenter"; private IMainView view; public MainPresenter(IMainView view) { this.view = view; } // Main管家处理登录逻辑 public void login(String username, String password) { if (username.isEmpty() || password.isEmpty()) { view.LoginFailed("账号或密码不能为空"); } else if (username.length() < 8 || password.length() < 9) { view.LoginFailed("账号至少8位,密码至少9位"); } else if (username.equals(MainActivity.USERNAME)) { if (password.endsWith(MainActivity.PASSWORD)) { // 登录成功,main拨打loginSuccess()电话通知主人登录成功了 view.LoginSuccess(); } else { // 登录失败,main拨打loginFailed()电话通知主人登录失败了,并告知失败原因 view.LoginFailed("密码错误"); } } } }
大管家会处理登录事件,然后把处理结果告诉大妹子,让大妹子根据不同的结果来进行不同的操作
相关文章推荐
- MVP模式简单理解
- 从最简单的HelloWorld理解MVP模式
- 从最简单的HelloWorld理解MVP模式
- 对Android中设计模式MVC,MVP,MVVM的简单理解
- Android MVC,MVP架构模式的简单理解
- Android中的MVC和MVP模式的简单理解
- 简单理解Vmware虚拟机网络连接模式(bridged、NAT、host-only)
- 用最简单的例子理解对象为Null模式(Null Object Pattern)
- Android产品研发(二十五)-->MVC/MVVM/MVP简单理解
- kotlin实现 简单的MVP模式
- 大话设计模式总结(28种设计模式定义+简单理解)
- Android MVP 模式 简单易懂的介绍方式
- MVC,MVP和MVVM三种模式的简单介绍
- Mvp 模式自我理解
- 简单理解常用设计模式(二)策略模式
- 快速理解简单工厂类模式
- 简单理解常用设计模式(十一)适配器模式
- 设计模式简单理解
- Android----MVP模式的理解
- Android设计模式理解(mvc mvp mvvm)