前言
android应用开发中,很多时候都在找适合自己应用的一种框架,便于应用的更为合理开发,也易于应用功能的扩展,但其实并没有说哪一种架构就是对所有应用都是适应的,所以我们只能在学习摸索之中找到适合我们自己应用的架构,在这里我就写一种比较常用的mvc架构,以后的后续博客当中还会有其他的方式分享给大家。很久之前就很想写一些关于开发过程中学习到的东西,可以跟开发者交流学习,这几天有些时间,果断就开始了。这是我的第一篇博客,写得不好还望提出批评建议。
什么是mvc?
说什么是mvc,百度概念是这样讲的:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑和数据显式分离的方法组织代码,将业务逻辑被聚集到一个部件里面,在界面和用户围绕数据的交互能被改进和个性化定制的同时而不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。(摘自百度)
通俗点来讲,利用mvc架构进行开发,能够将获取数据部分的代码跟数据展示部分的代码进行分离,能够在很大程度降低业务逻辑和数据显示之间的耦合性,易于代码的修改跟复用。看过一个例子很形象:就比如你有一堆数据,你可以选择用柱形图或者饼状图来显示,你怎样展示这些数据是跟你怎样得到这些数据是没有多大关系的。
用mvc的好处:利用mvc架构进行开发也有很多好处,就比如说开发小组当中,做界面的可以认真做着自己的界面,而负责业务逻辑部分的猿哥也可以钻研自己的业务逻辑,将其优化到最好;还有就是利用架构进行开发,可以让你的应用更模块化,扩展性更强。
下面就简单介绍一下各个层的一个作用,然后直接上图上代码,这样也来得直接一点。
不过还要说明一点,个人理解,就是mvc架构只是一种应用架构的设计模式,但实现方式并不是说只有一种,只要你不离这个原理,可以自己进行设计打造更加适合自己开发应用的一种架构。好了,这次真的不再啰嗦。
M:模型层(Model),获取数据、对数据进行操作处理部分,对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。
V:视图层(View),展示数据部分,一般都是使用XML搭界面,所以数据也就自然而然在这里进行展示,当然android应用界面的搭建还可以用HTML5等进行搭建,但这些不是这篇文中要讨论的。
C:控制层(Controller),android中的控制层是落在activity上,activity从Model层获取到数据之后,将其放到View层上面进行展示,这也让我们清楚,不要再activity当中写处理业务逻辑方面的代码,尤其是耗时的操作更加不能在这里写。
先看一下应用的架构:
这里解释一下:其中model包放的就是业务逻辑层的类,protocol包放的就是封装过的数据实体类,ui包就是activity,而下面的layout下的XML文件就是所谓的view层。大致是可以这样分的,当然也可以按照自己需求进行扩展,我在这里也就很简单的展示出整个应用的核心。
先看一下结果,也就是在model中模拟一个数据,经过处理在界面显示而已。
下面就展开到每个类来做解释:
1、person实体类,封装了person这个数据的属性和方法
package com.kroc.protocol;
/**
*
* @author 楷鹏
* @描述 person实体类,封装了person这个数据的属性和方法
*
*/
public class PERSON {
private int id;
private int age;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "PERSON [id=" + id + ", age=" + age + ", name=" + name + "]";
}
}
2、业务处理层的基类
package com.kroc.model;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author 林楷鹏
* @描述 业务处理层的基类,所有业务类都可以继承此类,这里可以负责处理一些通用的问题。比如联网超时,找不到服务器等。
*
*/
public class BaseModel implements BusinessResponse{
//存放响应的列表
private List
responseList = new ArrayList
();
@Override
public void OnMessageResponse(Object... results) {
//迭代将列表中的响应回调到activity中,回调之前可以先处理一下,比如判断回调的状态值等等
for(BusinessResponse response : responseList){
//这里可先处理一下再将其回调到activity
System.out.println("BaseModel里先处理了一次");
response.OnMessageResponse(results);
}
}
/**
* 将响应加到响应列表当中
* @param response
*/
public void addResponseListener(BusinessResponse response)
{
if (!responseList.contains(response))
{
responseList.add(response);
}
}
}
3、person业务处理类
package com.kroc.model;
import com.kroc.protocol.PERSON;
/**
*
* @author 楷鹏
* @描述 person业务处理类
*
*/
public class PersonModel extends BaseModel{
private PERSON person;
/**
* 获取person数据
*/
public void getPerson() {
//数据逻辑处理部分,这部分为模拟数据,真正应用时此处可以是获取网络数据等等
person = new PERSON();
person.setId(1);
person.setAge(15);
person.setName("小明");
//将得到的数据进行回调
PersonModel.this.OnMessageResponse(person);
}
}
4、响应回调接口
package com.kroc.model;
/**
*
* @author 林楷鹏
* @描述 响应回调接口
*
*/
public interface BusinessResponse {
/**
* 回调访问结果的函数
* @param results 此参数为可变参数,可以按照自己需求对参数进行修改
*/
public abstract void OnMessageResponse(Object...results);
}
5、activity
package com.kroc.ui;
import com.kroc.model.BusinessResponse;
import com.kroc.model.PersonModel;
import com.kroc.protocol.PERSON;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
/**
*
* @author 楷鹏
* @描述 主页面
*
*/
public class MainActivity extends Activity implements BusinessResponse{
private PersonModel personModel;//声明一个person的业务类对象
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.text);
personModel = new PersonModel();//对业务类进行实例化
personModel.addResponseListener(this);//注册响应监听器,经过注册,返回结果可以在OnMessageResponse方法得到
personModel.getPerson();//获取数据
}
@Override
public void OnMessageResponse(Object... results) {
System.out.println("回调了");
//处理回调数据
PERSON person = (PERSON)results[0];
textView.setText(person.toString());
System.out.println("person:"+person.toString());
}
}
6、activity_main.xml
结束语
基本上就是这样,各个类里面都有注释,大家可以参照注释进行学习,也能够根据此为基础进行扩展,我觉得这个小小的demo的框架经过扩展之后还是很不错的,可以用以开发代码量比较多的APP,如果有什么问题或者此demo有不好之处还请评论交流学习。好啦,也就差不多这样。