版权说明:本文是基于开源LumaQQ下,开发者不直接参与QQ协议的分析工作,移植到Android平台纯粹是为了方便学习和研究之用,并且没有产生任何直接的经济效益,并且纯粹是个人的技术学习研究行为,与本人所在单位没有任何关系。此文的读者在使用过程产生的效益和涉及的法律责任与本人没有直接关系。如果影响到您或您的公司利益,敬请谅解并且与我联系,本人会第一时间作出处理。
开场白:搭载Android操作系统的手机G1发布也有一段时间了,虽然还没有正式发售,但上面的应用程序也逐渐的丰富起来,对于IM来说现在的G1已经拥有很多款流行的聊天工具了,像AOL、Yahoo!、Windows Live 、Gtalk什么的,但对于国人来说,我们最熟悉,使用最多的QQ仍然没什么官方要开发的消息透漏出来,这可能也和现在的G1并不在中国发售有关系,所以我们仍然需要发扬黑客精神,继续我们非官方QQ开发之旅吧。
它山之石可以攻玉。lumaQQ中的UI部分虽然使用的SWT组件,但其中所使用到的设计思想我们还是可以借鉴的,让我们开始重构吧。
我们的QQ(注:这里的QQ代指我们的程序lumaQQME,而不是腾讯的QQ,以下部分没做说明默认如此)现阶段的代码好像一个大杂烩,几乎所有的代码都处于一个Activity中,界面和各种逻辑操作混杂在一起显得非常的混乱。一个好的设计要尽量做到界面和逻辑分离,界面和逻辑即使改动也没有影响或者影响最小。这里我们使用MVC模式来做到这一点。
MVC模式是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己。这个是mvc的定义,让我们来看看QQ是如何根据MVC模式来设计的。
QQ中的Model主要是用户、分组和群。这些Model对象对QQ packet包提供的数据进行抽象,以此来提供给View。
这里还有两个比较重要的类,一个是ModelUtils,这个是工具类,负责提供一些创建数据的方法;另一个是ModelRegistry,Model的注册表,用于根据关键字段快速查找model。
QQ中的Controller主要是QQEventProcessor,UIHelper。前者提供对QQ事件的处理,后者为UI部分提供执行一些界面相关的操作;
QQ中的View部分使用Android SDK中提供的技术,使用Xml来做界面的描述,实现了界面和操作的分离。
整体的类图如下
这是重构后的主要结构,不包括界面部分和一些其他辅助类的类图。
这里是最新的源代码下载,点击这里