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设计模式这么好,但是写起来有点麻烦,,,最最主要的问题就是,接口太多,造成占用内存比直接写大的问题。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件