MVC浅析(实际上应该是MVP,有时间再更新该博客)
来源:互联网 发布:淘宝刷单被发现怎么办 编辑:程序博客网 时间:2024/05/19 14:19
以Android中登录过程为例简单说明,其他应用场景同理。
定义接口:
Model层:IModelLogin.java
public interface IModelLogin { /** * 开始登录请求 * @param username * @param password */ abstract void iStartLogin(String username, String password);}
View层:IViewLogin.java
public interface IViewLogin { /** * 显示进度 * @param isProgress */ abstract void iShowProgress(boolean isProgress); /** * 错误提示 * @param object */ abstract void iErrorPrompt(Object object); /** * 进入到目标页面 */ abstract void iSwitchToTargetPage();}
Control层:ICtrlLogin.java
public interface ICtrlLogin { /** * 请求登录 * @param username * @param password */ abstract void iLogin(String username, String password); /** * 登录成功 * @param bean */ abstract void iLoginSuccess(UserInfo bean); /** * 登录失败 * @param message */ abstract void iLoginFailure(String message);}
至此整个登录过程的业务逻辑就已经梳理完毕了,过程为:页面点击登录按钮后,调用控制层接口iLogin,在iLogin中调用显示层接口iShowProgress显示进度条、并调用业务层的网络请求接口iStartLogin请求数据并解析,1.如果iStartLogin请求并解析登录成功则在iStartLogin中调用控制层接口iLoginSuccess,在iLoginSuccess中做相应处理并调用显示层接口iSwitchToTargetPage;2.如果业务层接口iStartLogin请求或解析登录失败则调用控制层接口iLoginFailure,在iLoginFailure中调用显示层接口iErrorPrompt。
下面贴出各层接口的实现类:
Model层:ModelLoginIpm.java
public class ModelLoginImp implements IModelLogin, INetResultListener { private static final String HTTP_LOGIN_TAG = "HTTP_LOGIN_TAG"; private static final String HTTP_LOGIN_METHOD = "/api/app/applogin"; private ICtrlLogin mPresent = null; public ModelLoginImp(ICtrlLogin present) { this.mPresent = present; } @Override public void iStartLogin(String username, String password) { NetRequest request = NetRequest.obtain(); request.setRequestMethod(RequestMethod.Post); request.setTag(HTTP_LOGIN_TAG); request.setClazz(HttpParser.class); request.setBaseUrl(ConstantValue.PUBLIC_NET_ADDRESS); // getRequestHeader(request, "", "", "", ""); // 交易服务代码(目标系统提供的URL地址) //request.addHeaderParam(); // 接口请求信息 request.setMethodUrl(HTTP_LOGIN_METHOD); request.addQueryParam("account", username); request.addQueryParam("password", password); request.setINetResultListener(this); request.doRequestAsyn(); } @SuppressWarnings("rawtypes") @Override public void iResultSuccess(NetResponse response, String tag) { try{ if(response!=null){ if(response.getResult()!=null &&response.getResult() instanceof HttpParser){ String data = ((HttpParser)response.getResult()).iParser(); mPresent.iLoginSuccess((UserInfo)JsonUtil.getClazzByGson(data, UserInfo.class)); } } }catch(NetException ex){ iResultFailure(ex,tag); }catch(Exception ex){ iResultFailure(new NetException(ex.getMessage(),""),tag); } } @Override public void iResultFailure(NetException ex, String tag) { mPresent.iLoginFailure(ex.getMsgInfo()); } @Override public void iResultStart(String tag) { }}
以上代码中使用了封装在自己写的框架中的网络请求和解析的方法,在此不便贴出来,请求和解析的方法原理都一样,网络上很多。
View层:LoginActivity.java
@ActivityFinder(R.layout.activity_login)public class LoginActivity extends BaseBackTitleActivity implements IViewLogin{ @ViewFinder(R.id.et_username) private EditText et_username; @ViewFinder(R.id.et_password) private EditText et_password; @ViewFinder(R.id.btn_login) private Button btn_login; /** * Loading window */ private ProgressDialog mProgressDialog = null; /** * ctrl层接口实现 */ private ICtrlLogin mPresent = null; public LoginActivity(){ mPresent = new CtrlLoginImp(this); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); } /** * 初始化界面 */ private void initView(){ initTitle(R.string.text_login); btn_login.setOnClickListener(this); } @Override public void iShowProgress(boolean bRet) { if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(this); } if (bRet) { mProgressDialog.show(); } else { mProgressDialog.dismiss(); } } @Override public void iErrorPrompt(Object object) { if(object !=null){ if(object instanceof Integer){ ToastTools.showToast((Integer)object); }else if(object instanceof String){ ToastTools.showToast((String)object); } } } @Override public void iSwitchToTargetPage() { this.finish(); } public void onClick(View arg0) { super.onClick(arg0); switch(arg0.getId()){ case R.id.btn_login: mPresent.iLogin(et_username.getText().toString(), et_password.getText().toString()); break; } }}
Control层:CtrlLoginImp.java
public class CtrlLoginImp implements ICtrlLogin { /** * Model层接口 */ IModelLogin mMode; /** * View 层接口 */ IViewLogin mView; /** * 用户名 */ private String mUsername; public CtrlLoginImp(IViewLogin mIViewLogin){ this.mView = mIViewLogin; this.mMode = new ModelLoginImp(this); } @Override public void iLogin(String username, String password) { if(checkInputFormat(username, password)){ mView.iShowProgress(true); mUsername = username; mMode.iStartLogin(username, password); } } /** * 数据本地检查 * @param username * @param password * @return */ private boolean checkInputFormat(String username, String password){ if(StringUtil.isBlank(username)){ mView.iErrorPrompt(R.string.warning_empty_username); return false; } if(PattenUtil.isCompanyNum(username)){ mView.iErrorPrompt(R.string.warning_wrong_username); return false; } if(StringUtil.isBlank(password)){ mView.iErrorPrompt(R.string.warning_empty_password); return false; } return true; } @Override public void iLoginSuccess(UserInfo bean) { mView.iShowProgress(false); if(bean!=null){ bean.username= mUsername; LoginManager.getInstance().onLogin(bean); mView.iSwitchToTargetPage(); } } @Override public void iLoginFailure(String message) { mView.iShowProgress(false); mView.iErrorPrompt(message); }}
接口设定了程序的逻辑结构,它就像是程序的说明书;接口实现中主要需要理解的是MCV三层如何协作。想必大家看了就会发现,按MVC模式编写的代码结构还是很清晰的。
0 0
- MVC浅析(实际上应该是MVP,有时间再更新该博客)
- 浅析MVC和MVP
- 有时间多看(牛人博客),持续更新。。。
- MVC、MVP、MVVM模式浅析
- MVC、MVVM、MVP 框架设计模式浅析
- 浅析前端MVC、MVP、MVVM模式
- Spring中的AOP(七)(实际上应该是一)——AspectJ的基本使用
- Spring中的AOP(七)(实际上应该是一)——AspectJ的基本使用
- MVC和MVP有什么区别
- 浅析前端开发中的 MVC/MVP/MVVM 模式
- 浅析前端开发中的 MVC/MVP/MVVM 模式
- MVP浅析
- MVP浅析
- MVP 浅析
- TOK 已经搬家,该博客停止更新。
- 博客更新时间预告黑板报
- 最近博客更新时间不稳定
- mvc与mvp的区别-life is beautiful-搜狐博客
- SQL基础教程之SQL指令
- JDK 1.8 新特性
- Codeforces Round #320 (Div. 2)(B)
- poj1836动态规划+最长上升子序列变形+最长增和最长减然后找出分割点
- Linux下查看文件和文件夹大小
- MVC浅析(实际上应该是MVP,有时间再更新该博客)
- redis缓存的安装和使用
- 关于xcode7ios9的bug
- CUDA实现图像反转
- Android httpClient 支持HTTPS
- ajax与HTML5 history pushState/replaceState实例
- WCF REST 上传图片下载
- C语言内存分区_栈区、堆区、全局&静态区、文字常量区、程序代码区
- 第三周项目(3):顺序表的基本算法