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

安卓设计模式学习之_MVP

2017-01-05 19:56 302 查看
MVP设计模式出现好久了,一直也在项目里面使用,相比以前的代码,从了解MVP之后,我才觉得以前写的代码真是渣渣 . 代码简洁,利索.解耦和 . 

我写了一个注册的demo.提高下写作的能力,

源码下载地址:http://download.csdn.net/detail/fkgjdkblxckvbxbgb/9729993

项目使用了okhttp框架,请自己下载jar包




项目的结构一目了然 . 
model层用来处理业务逻辑
persenter层用来交互view层与model层的数据,简称(控制层吧)
view层,用来接收Activity的输入数据,和用于界面的更新
model层的结构.开始看代码



Model======================================================
package com.reeman.demo.register.model;
//业务接口
public interface RegisterModel {
void register(String unseName, String password, RegListener listener);
}


package com.reeman.demo.register.model;

import java.io.File;
import java.io.IOException;

import org.json.JSONException;
import org.json.JSONObject;

import com.reeman.demo.config.AppConfig;

import android.os.Environment;
import android.widget.Toast;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
//业务实现类
public class RegisterModelImpl implements RegisterModel {

private static OkHttpClient mOkHttpClient;

public void register(String unseName, String password, final RegListener listener) {

if (unseName == null || unseName.length() < 3) {
listener.UsernameError();
return;
}
if (password == null || password.length() < 3) {
listener.PasswordError();
return;
}
mOkHttpClient = new OkHttpClient();
try {
String url = AppConfig.BASE_URL;
RequestBody requestBodyPost = new FormBody.Builder().add("action", "usRegist").add("username", unseName)
.add("password", password).build();
Request requestPost = new Request.Builder().url(url).post(requestBodyPost).build();
mOkHttpClient.newCall(requestPost).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
listener.OnFail(e.toString());
}

@Override
public void onResponse(Call call, Response response) throws IOException {
String htmlStr = response.body().string();
try {
JSONObject object = new JSONObject(htmlStr);
int code = object.getInt("statusCode");
listener.OnSuccess(code, htmlStr);
} catch (JSONException e) {
e.printStackTrace();
}

}
});
} catch (Exception e) {
}

}
}


//业务监听接口==================

package com.reeman.demo.register.model;

public interface RegListener {
void UsernameError();

void PasswordError();

void OnSuccess(int code, String desc);

void OnFail(String desc);
}


View层,接收Activity的输入信息,界面提示,以及注册成功之后的回调接口================
package com.reeman.demo.register.view;

public interface RegisterView {
String getUserName();

String getPassword();

void showToast(String text);

void RegisterSuccess();
}


parsenter层.处理model与view层之间的数据交互

package com.reeman.demo.register.personter;

import com.reeman.demo.register.model.RegListener;
import com.reeman.demo.register.model.RegisterModel;
import com.reeman.demo.register.model.RegisterModelImpl;
import com.reeman.demo.register.view.RegisterView;

public class RegisterPersonter implements RegListener {

RegisterView mRegisterView;
RegisterModel mRegisterModel;

public RegisterPersonter(RegisterView mRegisterView) {
this.mRegisterView = mRegisterView;
mRegisterModel = new RegisterModelImpl();
}

public void register() {
String unseName = mRegisterView.getUserName();
String password = mRegisterView.getPassword();
mRegisterModel.register(unseName, password, this);
}

@Override
public void UsernameError() {
mRegisterView.showToast("用戶名錯誤");

}

@Override
public void PasswordError() {
mRegisterView.showToast("密碼錯誤");
}

@Override
public void OnSuccess(int code, String desc) {
if (code == 0) {
mRegisterView.showToast("注册成功");
mRegisterView.RegisterSuccess();
} else {
mRegisterView.showToast("註冊失敗,請檢查用戶名或者密碼");
}
}

public void OnFail(String desc) {
mRegisterView.showToast("註冊失敗,請檢查網絡");
}

}


Activity界面交互

package com.reeman.demo.register.activity;

import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.reeman.demo.R;
import com.reeman.demo.register.personter.RegisterPersonter;
import com.reeman.demo.register.view.RegisterView;
import com.reeman.demo.view.SwipeBackActivity;

public class RegisterActivity extends SwipeBackActivity implements RegisterView {

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
initView();
}

EditText et_username, et_password;
Button btn_login, btn_register;
RegisterPersonter mRegisterPersonter;

private void initView() {
mRegisterPersonter = new RegisterPersonter(this);
et_username = (EditText) findViewById(R.id.et_username);
et_password = (EditText) findViewById(R.id.et_password);
btn_login = (Button) findViewById(R.id.btn_login);
btn_register = (Button) findViewById(R.id.btn_register);
btn_register.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
mRegisterPersonter.register();
}
});
}

public String getUserName() {
return et_username.getText().toString();
}

@Override
public String getPassword() {
return et_password.getText().toString();
}

Handler handler = new Handler();

public void showToast(final String text) {
handler.post(new Runnable() {

public void run() {
Toast.makeText(RegisterActivity.this, text, Toast.LENGTH_SHORT).show();
}
});
}

public void RegisterSuccess() {
finish();
}
}

看完有一种畅爽的感觉 . 这样无论代码给谁写,看起来都比较轻松 . 万一某一个模块出现问题,完全不影响其他的功能 . 大不了重写一份,如果不用设计模式,所有的代码耦合度太强,一个功能的一个参数发生了变化, 对不起,你这个功能所有逻辑都可能会牵一发动全身 . 

欢迎探讨
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 设计模式 mvp