All right!Android刚开始开发比较容易,但是感觉进阶就太难了。
下面说一下MVP设计模式。
熟知Android开发的朋友们,都知道Android开发用MVC设计模式,但是View还有Control,申请数据都要写在Activity中,这样Activity代码量多的不得了。 MVP设计模式应运而生。MVP设计模式减少了Activity的代码量。
闲话不多说,上代码
在activity_main中
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context="com.study.administrator.mystudyvitamio.MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/uname_et" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/uname_et" android:id="@+id/upsw_et" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="确定" android:textSize="30sp" android:layout_below="@id/upsw_et" android:id="@+id/ok_tv" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="清空" android:textSize="30sp" android:layout_below="@id/upsw_et" android:layout_toRightOf="@id/ok_tv" android:layout_marginLeft="100dp" android:id="@+id/clear_tv" /> </RelativeLayout>
User
package com.study.administrator.mystudyvitamio.bean; /** * Created by Administrator on 2016/12/29. */ public class User { private String uname; private String upsw; public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getUpsw() { return upsw; } public void setUpsw(String upsw) { this.upsw = upsw; } }
UserBiz
package com.study.administrator.mystudyvitamio.model; import com.study.administrator.mystudyvitamio.bean.User; /** * Created by Administrator on 2016/12/29. */ public interface UserBiz { public User initUser(); }
UserImp
package com.study.administrator.mystudyvitamio.model; import com.study.administrator.mystudyvitamio.bean.User; /** * Created by Administrator on 2016/12/29. */ public class UserImp implements UserBiz{ @Override public User initUser() { User user=new User(); user.setUname("12345"); user.setUpsw("54321"); return user; } }
LoginPresenter
package com.study.administrator.mystudyvitamio.presenter; /** * Created by Administrator on 2016/12/29. */ public interface LoginPresenter { public void loginOK(); public void clearMsg(); public void initUser(); }
LoginPresenterImp
package com.study.administrator.mystudyvitamio.presenter; import com.study.administrator.mystudyvitamio.bean.User; import com.study.administrator.mystudyvitamio.model.UserBiz; import com.study.administrator.mystudyvitamio.model.UserImp; import com.study.administrator.mystudyvitamio.view.LoginView; /** * Created by Administrator on 2016/12/29. */ public class LoginPresenterImp implements LoginPresenter{ private LoginView mLoginView; private String unameString; private String upswString; private UserBiz userBiz; private User user; public LoginPresenterImp(LoginView mLoginView) { this.mLoginView = mLoginView; userBiz=new UserImp(); } @Override public void loginOK() { unameString=mLoginView.getUnameString(); upswString=mLoginView.getUpswString(); if (user.getUname().equals(unameString)&&user.getUpsw().equals(upswString)){ mLoginView.toastMsg("登陆成功!"); }else { mLoginView.toastMsg("账号或者密码不正确..."); } } @Override public void clearMsg() { mLoginView.clearUnameUpsw(); } @Override public void initUser() { user=userBiz.initUser(); } }
LoginView
package com.study.administrator.mystudyvitamio.view; /** * Created by Administrator on 2016/12/29. */ public interface LoginView { public String getUnameString(); public String getUpswString(); public void toastMsg(String msg); public void clearUnameUpsw(); }
Activity
package com.study.administrator.mystudyvitamio; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.study.administrator.mystudyvitamio.presenter.LoginPresenter; import com.study.administrator.mystudyvitamio.presenter.LoginPresenterImp; import com.study.administrator.mystudyvitamio.view.LoginView; public class MainActivity extends AppCompatActivity implements View.OnClickListener ,LoginView{ private EditText uname_et; private EditText upsw_et; private TextView ok_tv; private TextView clear_tv; private LoginPresenter mLoginPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); mLoginPresenter=new LoginPresenterImp(this); mLoginPresenter.initUser(); } private void initView() { uname_et= (EditText) findViewById(R.id.uname_et); upsw_et= (EditText) findViewById(R.id.upsw_et); ok_tv= (TextView) findViewById(R.id.ok_tv); ok_tv.setClickable(true); ok_tv.setOnClickListener(this); clear_tv= (TextView) findViewById(R.id.clear_tv); clear_tv.setClickable(true); clear_tv.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.ok_tv: mLoginPresenter.loginOK(); break; case R.id.clear_tv: mLoginPresenter.clearMsg(); break; } } @Override public String getUnameString() { String unameString=uname_et.getText().toString(); return unameString; } @Override public String getUpswString() { String upswString=upsw_et.getText().toString(); return upswString; } @Override public void toastMsg(String msg) { Toast.makeText(this,msg,Toast.LENGTH_SHORT).show(); } @Override public void clearUnameUpsw() { uname_et.setText(""); upsw_et.setText(""); toastMsg("清除成功"); } }
MVP设计模式,主要是View和Presenter两个模式里面都要继承一个接口,只要有逻辑的操作,就全盘先扔到Presenter里面去,再写逻辑代码的时候,如果有需要对UI进行操作的,就抛到View接口里面去。在Activity中 这些只是实现UI的操作,获取与用户交互的数据以及一些简单的判断。数据的存储和对数据操作主要是在Presenter里面进行操作
这样Activity承担的代码量就少了,只是承担与用户交互还有Activity生命周期,,即使是这样,Activity的代码量也是很多的。
但是在实际操作过程中,发现一个问题,其实Presenter并不一定要写一个接口,本来Activity就能调用Presenter实现的类里面的方法。如果Presenter有集成的接口,接口的方法一眼就能看到,这样便于逻辑代码的浏览,也许这就是Presenter有集成接口的好处。
Tips;
如果有多种逻辑代码时候,需要有多个Presenter 可以通过Activity进行周转 比如说 LoginPresenter要调用加载数据的dataPresenter, 这样在Activity要有LoginPresenter和dataPresenter两个对象 这个你直接在loginPresenter调用Activity的接口方法 然后在Activit的那个方法中写调用dataPresenter的方法 这样就成功调用dataPresenter的方法了
后记:虽然MVP设计模式这么好,但是写起来有点麻烦,,,最最主要的问题就是,接口太多,造成占用内存比直接写大的问题。