快速业务通道

使用CommonNavigator开发资源管理器--模型篇 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

使用CommonNavigator开发资源管理器--模型篇

时间:2011-08-11 zhuxing

在基础篇中,已经通过例子初步说明了,如何基于CNF制作一个简单的资源管理器,但很多开发人员并 不理解,树上的结点是如何得到的,这就涉及到CNF的模型。在详述CNF的模型之前,需要先对Tree所使用 的模型进行描述。

对于早期习惯C/S开发的程序员来说,对于SWT中的Tree并不陌生,可以通过相应的TreeItem来创建子 结点,但是这并不是一种好的设计和使用方式,它大大的增加了模型与UI之间的耦合度,所以在Swing中 ,使用了TreeNode来描述树模型,而Eclipse则通过JFace提供了ITreeContentProvider接口来描述树模型 。这两种方式有异曲同工之处,大家可以看一下这两个接口,就会发现两者非常之雷同,最大的区别在于 前者通过userObject持有真实的数据,而后者则是由TreeItem的getData来持有,在使用的时候,才会由 相应的TreeViewer传给ITreeContentProvider,从结构来说,后者是一个纯粹的控制类,而TreeNode则是 更灵活一些,可以作为一个控制类,也可以作为一个模型体,所以相对而言,TreeNode更加灵活一些,但 从本质上而言,两者并无区别。

表面上看来,一个TreeViewer将会拥有一个ITreeContentProvider用来取得树状的数据模型,进而呈 现出来,但CNF中的树却更加灵活,在基础篇中,展现的图中,却表示可以通过扩展点 org.eclipse.ui.navigator.navigatorContent来添加新的结点,而且这些与资源并没有本质的关系,它 可以与一个具体的文件或者目录资源绑定,也可以与多个具体的文件或者目录绑定,还可以是一个与文件 或者目录无关的模型。那么现在来看一下CNF到底做了哪些事情,使得它的模型扩展如此容易呢?

首先启动Eclipse32.,然后创建一个新的工作区,再将CNF相关的代码以插件的形式导入到这个工作区 中,开始我们的分析过程。

讲到这里,要提到Eclipse提供的一个接口IWorkbenchAdapter和IWorkbenchAdapter2,这两个接口是 有一点点怪的,因为从设计的角度来看,它将模型与展现层混合在一起,违反常见的设计准则,但从另一 个角度来讲,它可以减少用户扩展的内容,有利于用户开发。由此可见设计准则并不是一成不变的,很多 时候,它也要在易用性和合理性方面做出适当的妥协。这一点也可以在我们自己的设计中加以考虑,设计 并不是要偏向哪一个方向,恰恰相反,设计是要在多者之间,如易用性,稳定性,合理性之间取得一个平 衡点,而不是在各方面都做到完美。

另外ITreeContentProvider有一个方法getParent(Object parent),它是用来为一个指定结点找到相 应的父亲结点,从而便于查找和定位,而这个方法却被很多人所忽视,开发人员经常会习惯性的直接返回 null,而且也不会出现什么错误,但这个方法其实却是一个非常有用的方法,开发人员在使用Java资源管 理器的时候,有一个经常使用的功能就是LinkWithEditor,这个功能经常是用来在资源管理器上定位当前 打开的文件,这个功能如此之重要,以至于CNF专门为此定义了一个 org.eclipse.ui.navigator.linkHelper来支持该功能。所以请根据实际情况,来实现这个方法,否则就 无法正确的实现相应的功能。

以上对TreeViewer的模型进行了简单的介绍和分析,接下来就看一下CNF是如何处理树模型从而获得如 此高的灵活性。

CNF很好的利用了代理模式,它自身并没有提供模型的能力,所以它将提供模型的能力仍然交给外部扩 展点提供的类,它会根据当前要处理的结点,以及每个扩展点的表达式,来找出能够处理当前结点的 ITreeContentProvider实例,然后再将这些实例返回的子结点放入相应的Set中,最终以数组的方式返回 给TreeViewer,从表面上来看,可能很难理解正常情况下,每个TreeViewer只有一个 ITreeContentProvider的模型接口,如何能够从多个实例中取得模型呢?就是由 NavigatorContentServiceContentProvider这个代理类完成模型的组合功能。

因此只要提供自己的ITreeContentProvidre实现,然后通过扩展点挂入,即可将各种真实或者虚拟的 模型挂入系统。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号