您的位置:首页 > 移动开发 > Android开发

Android,谈谈MVP设计模式

2016-12-29 13:52 337 查看
    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{@Overridepublic 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();}@Overridepublic void loginOK() {unameString=mLoginView.getUnameString();upswString=mLoginView.getUpswString();if (user.getUname().equals(unameString)&&user.getUpsw().equals(upswString)){mLoginView.toastMsg("登陆成功!");}else {mLoginView.toastMsg("账号或者密码不正确...");}}@Overridepublic void clearMsg() {mLoginView.clearUnameUpsw();}@Overridepublic 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;@Overrideprotected 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);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.ok_tv:mLoginPresenter.loginOK();break;case R.id.clear_tv:mLoginPresenter.clearMsg();break;}}@Overridepublic String getUnameString() {String unameString=uname_et.getText().toString();return unameString;}@Overridepublic String getUpswString() {String upswString=upsw_et.getText().toString();return upswString;}@Overridepublic void toastMsg(String msg) {Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();}@Overridepublic 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设计模式这么好,但是写起来有点麻烦,,,最最主要的问题就是,接口太多,造成占用内存比直接写大的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mvp 设计模式 android