MVC全名为Model View Controller,即模型+视图+控制器。
Model层:实现系统的业务逻辑;
View层:负责与用户交互,即在界面上展示数据对象给用户;
Control层:Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。
最典型的MVC就是Web应用中的jsp+servlet+javabean模式。JavaBean为模型,JSP实现视图层,Serlvet实现控制器。
MVC的优点有:耦合性低、重用性高、部署快、可维护性高等;
框架和设计模式存在一些区别如下:
框架模式通常有MVC、MTV、MVP、CBD、ORM等;
框架通常有C++语言的QT、MFC、gtk,Java语言的SSH 、SSI,php语言的 smarty(MVC模式),python语言的django(MTV模式)等;
在Android中使用MVC最典型的例子就是ListView,功能更加强大的RecyclerView。
View指的是组件,此处为listView用来显示封装好的数据,即每一条Item的显示形式;
Model为各种数据源,此处为在ListView中是指添加到View中的数据;
Control代表Adapter类,Android定义了很多适配器的实现类,其中比较容易使用的有 ArrayAdapter,可以通过泛型指定数据类型,另外用户也可以自定义Adapter。Adapter需要使用getView方法返回当前列表项显示的View对象,当Model发生改变的时候,需通知组件数据发生变化,然后调用getView方法重新显示内容,Adapte起着桥梁的作用。
补充内容:通过使用ViewHolder可以提高ListView的运行效率。
当ListView有大量的数据需要加载的时候,会占据大量内存,影响系统性能,此时就需要按需填充并重新使用view来减少对象的创建。使用内部类ViewHolder对控件的实例进行缓存。
重写getView方法加载的方式通常有三种,第一种就是每一次都重新定义一个View载入布局,再加载数据。第二种当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,然后加载数据,实例代码如下:
if (convertView == null) {
iconvertView = LayoutInflater.from(getContext()).inflate(
R.layout.item, parent, false);
}
第三种定义一个ViewHolder内部类,定义如下:
class ViewHolder {
TextView tv;
ImageView iv;
}
方法getView()中的主要代码如下:
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(
R.layout.item,parent, false);
viewHolder = new ViewHolder();
viewHolder.tv = (TextView) convertView.findViewById(R.id.text);
viewHolder.iv = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}