到目前为止MVC模式已得到了广泛的应用。各种类型的程序(桌面程序、Web程序、移动程序等)都设计了MVC模式。著名的Java Web框架Struts就是一套不折不扣的MVC框架。MVC的主要目的是使程序中的数据和界面分离,其中M表示模型(Model,也就是数据),V表示试图(View,也就是界面),C表示控制器(Controller,用于控制M和V之间的联系)。Android SDK同样采用了MVC模式来展现数据和界面的关系。那么Android SDK中有哪些组件使用到了MVC模式,其基本原理是什么?
MVC的基本原理就是通过Controller连接Model和View的。也就是说,当View中显示的数据变化时(如ListView要删除某个列表项),会通知Controller,而不是直接通知Model。这时Controller接到View的通知后,会在Model中采取相应的动作(如删除数据库中的某条记录)。如果模型的数据发生变化(如插入、删除数据库中的记录),会将变化通知Controller,然后Controller会通知View重新显示数据。
使用MVC模式可以将显示部分与数据部分分离,这样当更新View或Model时可以不影响对方,更有利于程序的维护。
在Android SDK中使用MVC模式的组件非常多。例如,所有的列表控件(ListView、Spinner、GridView等)都采用MVC模式与数据交互。在Android中MVC中的V就代表这些组件,而M则代表各种数据源及操作数据库的库。C则代表Adapter类。Android中的Adapter类分很多程度,但都拥有共同的接口。这些Adapter类主要包括BaseAdapter、SimpleAdapter、ArrayAdapter、CursorAdapter等。它们分别对应不同的数据源,ArrayAdapter对应List集合和数据数据源,而CursorAdapter对应Cursor对象(一般是从数据库中获取的记录集)。这些Adapter类都是需要使用GetView方法返回当前列表项显示的View对象。当Model发生改变时,会调用BaseAdapter.notifyDataSetChanged()方法通知组件数据已变化,这时Adapter回调用getView方法用于重新显示组件中的内容。当组件中显示的数据变化时,如删除一个列表项,组件会通过Adapter中的方法删除Model中相应的记录,然后再调用BaseAdapter.notifyDataSetChanged()方法使组件中显示的数据发生变化。总言之,无论数据变化还是组件中显示的数据发生变化,都需要将Adapter作为桥梁来达到View和Model之间同步的目的。