MVC浅析(实际上应该是MVP,有时间再更新该博客)
2015-09-17 17:05
267 查看
以Android中登录过程为例简单说明,其他应用场景同理。
定义接口:
Model层:IModelLogin.java
View层:IViewLogin.java
Control层:ICtrlLogin.java
至此整个登录过程的业务逻辑就已经梳理完毕了,过程为:页面点击登录按钮后,调用控制层接口iLogin,在iLogin中调用显示层接口iShowProgress显示进度条、并调用业务层的网络请求接口iStartLogin请求数据并解析,1.如果iStartLogin请求并解析登录成功则在iStartLogin中调用控制层接口iLoginSuccess,在iLoginSuccess中做相应处理并调用显示层接口iSwitchToTargetPage;2.如果业务层接口iStartLogin请求或解析登录失败则调用控制层接口iLoginFailure,在iLoginFailure中调用显示层接口iErrorPrompt。
下面贴出各层接口的实现类:
Model层:ModelLoginIpm.java
以上代码中使用了封装在自己写的框架中的网络请求和解析的方法,在此不便贴出来,请求和解析的方法原理都一样,网络上很多。
View层:LoginActivity.java
Control层:CtrlLoginImp.java
接口设定了程序的逻辑结构,它就像是程序的说明书;接口实现中主要需要理解的是MCV三层如何协作。想必大家看了就会发现,按MVC模式编写的代码结构还是很清晰的。
定义接口:
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模式编写的代码结构还是很清晰的。
相关文章推荐
- 文本渐变
- return false 无效
- Android httpClient 支持HTTPS
- redis缓存的安装和使用
- Linux下查看文件和文件夹大小
- c# 字符串切割 split
- 使用RelativeLayout控制WebView以及Bottom按钮的位置
- PCA主成分分析
- 合并BIN文件的两种方法
- c# 委托 事件
- iOS中的 沙盒文件夹 (数据的写入和读取,归档和反归档)
- 前端web开发的MVC模式 - 从一个简单实例讲起
- poj1836动态规划+最长上升子序列变形+最长增和最长减然后找出分割点
- Codeforces Round #320 (Div. 2)(B)
- JDK 1.8 新特性
- 「图论」最小生成树-Prime算法
- 关于执行顺序
- 最小公倍数(LCM)
- 使用ActionBar Tab
- LDA (Linear Discriminant Analysis) 线性判别分析