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() {@Overridepublic void onFailure(Call call, IOException e) {listener.OnFail(e.toString());}@Overridepublic 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);}@Overridepublic void UsernameError() {mRegisterView.showToast("用戶名錯誤");}@Overridepublic void PasswordError() {mRegisterView.showToast("密碼錯誤");}@Overridepublic 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();}@Overridepublic 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();}
}

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

欢迎探讨

安卓设计模式学习之_MVP相关推荐

  1. 【安卓Framework学习】Wifi框架学习之wifi状态机

    系列文章目录 [安卓Framework学习]Wifi框架学习之核心类. [安卓Framework学习]Wifi框架学习之开启与关闭流程. [安卓Framework学习]Wifi框架学习之连接与断开流程 ...

  2. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  3. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  4. Builder (建造者) — 【面向对象设计模式学习】

    Builder (建造者) - [面向对象设计模式学习] By CityWalker 2010年3月19日 Intent Separate the construction of a complex ...

  5. 设计模式学习笔记清单

    设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累.      ...

  6. 步步为营 .NET 设计模式学习笔记系列总结

    设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...

  7. 面向对象软件设计——设计模式学习

    工作也从开始C语言,转向现在的C++,表面上看得出,但实际中却没有把这种转变深入到思想中,究其原因还是对面向对象的软件设计不了解,有必要好好学习一下设计模式这个东东.本文就是设计模式学习第一篇-- 1 ...

  8. 设计模式学习笔记--Strategy 策略模式

    所谓策略模式(Strategy Pattern),就是将策略 (算法) 封装为一个对象,易于相互替换,如同 USB 设备一样可即插即用:如果将策略.具体的算法和行为,编码在某个类或客户程序内部,将导至 ...

  9. 设计模式学习之代理模式学习(一)

    设计模式学习之代理模式学习(一) 关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一 ...

最新文章

  1. 中科院城环所朱永官院士团队(宁波)招聘全职博士后启事
  2. python c++操作raw文件
  3. 手机中geetest是什么文件_安卓手机系统中各类英文文件夹的含义详解,不知道的尽快熟知!...
  4. asp.net(c#) static关键字用法小结
  5. Mathematica 画图操作中的一些小惊喜
  6. syntax error: unexpected end of file
  7. Centos 安装 禅道
  8. c mysql 统计不重复数据库,MySQL_MySQL数据库中分组统计的问题,首先准备四张表A、B、C、D, - phpStudy...
  9. pg_restore - 从一个由 pg_dump 创建的备份文件中恢复 PostgreSQL 数据库。
  10. day③:函数式编程
  11. Log4net 配置详解
  12. 读取图像中任意点的像素值
  13. 源码维护基本命令diff_patch_quilt
  14. 基于cat12和SPM12进行VBMSBM数据分析笔记1——数据预处理
  15. 二頌(金火互易過程)
  16. 数据表为什么又叫透明表?
  17. 解决:ClassCastException: org.springframework.util.LinkedCaseInsensi
  18. 三款ActiveX图表控件对比评测 Pro ActiveX、ProEssentials、ChartDirector
  19. 【渗透工具】浏览器数据导出工具
  20. 利用cpolar为群晖NAS建立稳定外网地址(1)

热门文章

  1. python面向对象——烤土豆,开枪案例
  2. c语言自动生成矩阵,C语言如何随机生成一个矩阵
  3. 如何思考文章中的关键词
  4. php怎么判断平年和闰年,教你怎么判断平年和闰年
  5. 【GitChat】专利基础知识及写作经验分享
  6. sublime Emmet的用法及相关语法
  7. 【图像重建】基于matlab L1范数自适应双边总变分超分辨率图像序列重建【含Matlab源码 2209期】
  8. keepalived MySQL 脑裂_keepalived 脑裂解决思路
  9. wifi摄像模组连接手机远程监控的操作方法,家里监控怎么连接手机远程监控
  10. 一文详解路由器配置信息