安卓设计模式学习之_MVP
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相关推荐
- 【安卓Framework学习】Wifi框架学习之wifi状态机
系列文章目录 [安卓Framework学习]Wifi框架学习之核心类. [安卓Framework学习]Wifi框架学习之开启与关闭流程. [安卓Framework学习]Wifi框架学习之连接与断开流程 ...
- 7 种 Javascript 常用设计模式学习笔记
7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...
- java/android 设计模式学习笔记(1)--- 单例模式
前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...
- Builder (建造者) — 【面向对象设计模式学习】
Builder (建造者) - [面向对象设计模式学习] By CityWalker 2010年3月19日 Intent Separate the construction of a complex ...
- 设计模式学习笔记清单
设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累. ...
- 步步为营 .NET 设计模式学习笔记系列总结
设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...
- 面向对象软件设计——设计模式学习
工作也从开始C语言,转向现在的C++,表面上看得出,但实际中却没有把这种转变深入到思想中,究其原因还是对面向对象的软件设计不了解,有必要好好学习一下设计模式这个东东.本文就是设计模式学习第一篇-- 1 ...
- 设计模式学习笔记--Strategy 策略模式
所谓策略模式(Strategy Pattern),就是将策略 (算法) 封装为一个对象,易于相互替换,如同 USB 设备一样可即插即用:如果将策略.具体的算法和行为,编码在某个类或客户程序内部,将导至 ...
- 设计模式学习之代理模式学习(一)
设计模式学习之代理模式学习(一) 关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一 ...
最新文章
- 中科院城环所朱永官院士团队(宁波)招聘全职博士后启事
- python c++操作raw文件
- 手机中geetest是什么文件_安卓手机系统中各类英文文件夹的含义详解,不知道的尽快熟知!...
- asp.net(c#) static关键字用法小结
- Mathematica 画图操作中的一些小惊喜
- syntax error: unexpected end of file
- Centos 安装 禅道
- c mysql 统计不重复数据库,MySQL_MySQL数据库中分组统计的问题,首先准备四张表A、B、C、D, - phpStudy...
- pg_restore - 从一个由 pg_dump 创建的备份文件中恢复 PostgreSQL 数据库。
- day③:函数式编程
- Log4net 配置详解
- 读取图像中任意点的像素值
- 源码维护基本命令diff_patch_quilt
- 基于cat12和SPM12进行VBMSBM数据分析笔记1——数据预处理
- 二頌(金火互易過程)
- 数据表为什么又叫透明表?
- 解决:ClassCastException: org.springframework.util.LinkedCaseInsensi
- 三款ActiveX图表控件对比评测 Pro ActiveX、ProEssentials、ChartDirector
- 【渗透工具】浏览器数据导出工具
- 利用cpolar为群晖NAS建立稳定外网地址(1)