`
BlueDavy
  • 浏览: 153740 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

向RCP致敬

阅读更多

作为一个桌面应用的开发者,向 RCP 致敬的理由会是 RCP 提供了丰富的界面控件,使得基于 Java 开发桌面应用也变得容易了很多,尽管仍然不能和基于 VB Delphi 去相比;对于我而言,尽管使用 RCP 也是为了开发桌面应用,但 RCP 给我带来的更多的感觉是在它充分发挥插件化系统的优势方面, RCP 可以视为基于 OSGi 构建插件化系统的最佳实践的指导,从 RCP 的设计中,可以学习到如何让应用做到模块化、让应用做到动态化,甚至还可以学习到象如何自动生成界面这样的细节设计思想,尽管我自己基于 OSGi 做应用型的产品也做了一段时间了,但自己仍然一直感觉到在发挥插件化系统的优势方面还有不小差距, RCP 可以看做是基于 OSGi 做插件化应用系统的最佳实践,其中的不少设计方法甚至都可以整理成为基于 OSGi 做插件化应用系统的设计模式,让我们进入 RCP 之旅,揭开面纱,一探其本质吧,相信大家在了解了 RCP 的设计思想,看过其代码后,不得不对 RCP 表示崇高的敬意,大师之作,不同凡响。

致敬理由一:即插即用 / 即删即无的设计 / 实现指导 <o:p></o:p>

在构建插件化的应用系统的时候,我们通常希望做到以下三点:

1.         通过增加插件来动态扩展系统功能,包括功能的入口等,最重要的就是不要因为增加的新的插件,而导致对原插件的修改,做到即插即用, OSGi 本身提供了基于插件动态扩展系统功能的支持,但是否可以真的做到即插即用,是否可以不导致对原插件的修改,这个还是要看设计者的功力;

2.         通过删除插件来动态移除系统功能,包括功能的入口等,最重要的就是要让插件的卸载不影响到系统的运行,这个和 1 里面所说的情况也是一样的, OSGi 是可以支持这样的要求,但应用系统是否能做到还是看设计者的功力;

3.         通过增加或更新插件来动态改变系统行为。

RCP 呢,通过基于 OSGi 来保证其插件化以及动态化可实现的情况下,还定义了扩展点的机制,而正是因为扩展点的机制,使得 RCP 在设计角度能够更好的达到了我们构建插件化应用系统的前两个目标,同时 RCP 通过其对桌面应用支撑的设计为我们展示了扩展点的最佳实践方法,将界面按照对象的思想进行划分,在划分的过程中根据职责形成插件,暴露出扩展点,最后形成了象树一样的结构体系,如图所示:

image.jpg
图表
1 RCP 结构示意图

这种设计方法最佳的一个地方就在于充分的做到了真正的即插即用、即删即无的情况,典型的例子就是在 RCP 中可以通过扩展实现 Perspective ,将这个插件安装上后就可以在 RCP 中看到这个 Perspective ,删除这个插件后 RCP 中自然就看不到这个 Perspective 了。

RCP 的结构体系上,可以看出 RCP 在基于扩展点的设计思想上是怎么去设计的,它的设计思路采取的就是从顶至下、按照职责进行划分、形成插件的方法,插件中需要支持动态扩展的部分则做成扩展点,从而形成一个非常容易扩展的开发平台。

这对于 B/S 系统的设计有什么指导的地方呢?至少在我自己目前的基于 OSGi 的产品的 B/S 部分上,我承认并没有做到真正的即插即用、即删即无,在安装一个插件后其菜单的链接需要手工的加上、在删除一个插件后其菜单的链接也需要手工的删除,而模块内的按钮呀等等元素,也是同样如此,并没有做到说增加一个插件,模块内的按钮就可以自动增加这样的情况,而这呢,其实一定程度上就削弱了插件化带来的好处, :) ,当然,这里的例子说的有些极端了,并不是每个按钮、每个界面都要追求完全的插件化的,但这种设计思想是非常有用的,系统中需要支持插件化的地方多着呢,在这样的场景下 RCP 就提供了实现的设计思想和参考了,而且这种设计思想还可以延伸到后台模块部分,来看看参考 RCP 使用扩展点的方式来改造下 B/S 系统的设计方法。

先来看看界面部分,界面怎么样去设计,使其能够支撑插件的即插即用、即删即无这也是非常关键的,这个部分几乎是完全可以参考 RCP 的设计,但要考虑 B/S 系统的特殊性,例如 B/S 系统在界面展现上采用 Html 这样的方式显然更为适合,在这样的设计的情况下, B/S 系统界面中的公用菜单、按钮等部分就可以由各模块的插件扩展来构成了,而当插件卸载时,这些公用菜单、按钮中的东西自然就没有了,而对于模块内的元素也需要考虑采取类似的设计,把握住设计原则就行了,需要支持动态扩展的部分就做成扩展点, Eclipse 对于这种扩展称为贡献,这个名词取的实在是太好了。

再来看看后台模块部分,后台模块部分之前一直说的在 OSGi 中采用 Hibernate 比较的麻烦,只能采用将所有模块的 po 都放入同一个 Bundle 的折衷方案,而其实采用类似扩展点的设计方法的话,就可以实现各 PO 放入各模块自己的 Bundle 中了,这个我会通过 demo 的方式来进行说明,其实这样的方法同样可以衍生到 webwork 那些中去,让这些传统的开源的东西都能够支撑插件化。

从这个方面来看, RCP 的扩展点的设计思想为实现即插即用、即删即无提供了可行的设计方式,同时它的实现方法更是为我们如何采用扩展点机制来实现这个提供了指导,在这里呢,也要纠正了下自己以前对于 RCP 的扩展点的看法,尽管扩展点的实现确实可以基于 OSGi service 的方式来实现,但在很多场景下确实不如 RCP 本身的扩展点机制好用,例如在帮助视图中,就是一个典型的场景,因为那只是替换了一个帮助的文本信息和图片而已,根本用不着去写类来实现,这点上来说扩展点的机制还是非常好用的, Equinox 中现在也有扩展点这个插件,还是比较爽的, J

即插即用、即删即无的支持使得系统可以很好的以插件的方式来进行组装,做系统的时候就象在种树,先把系统的根撒下,让根长出主干,在主干上培育出枝叶,枝叶上结点果实,整颗树就这么养成了,当不需要了某个果实的时候,把它摘下来吃了,当不需要了某颗枝叶的时候,把那颗枝叶砍了,而这都不会影响到主干,当希望树上形成别的果实的时候,甚至都可以接上个不同的枝叶,让它长出不一样的果实,比普通树强多了,改名成高科技树算了, J

<o:p> b-5-01.jpg</o:p>

致敬理由二:动态的选择插件来形成功能 / 界面

扩展插件是一个需要支持的方面,但怎么样根据时机来选择合适的插件呢,这个问题显然就是在支持扩展插件后的一个更重要的问题了,为什么这么说呢,一个典型的场景如下:

系统中几个插件都扩展提供了右键弹出的菜单,在运行的过程中,肯定是希望插件只弹出自己的那部分扩展的菜单,而不会希望什么菜单都出现,这呢,就需要动态的去选择插件来形成菜单,在 RCP 中这块的设计采用的是在扩展点中增加标识的方式,这样的话在获取扩展点实现的时候就可以通过获取相应的标识来进行过滤,这个功能呢,和 OSGi 中支持 service 的过滤是一样的,虽然这不属于 RCP 的创意,但这也是一个实践的不错的指导。

在形成界面方面 RCP 采用了同样的方法,例如在一个属性窗口中,系统可以自动的根据其中字段扩展点的实现加上标识的过滤来组装出不同的界面,把这个设计思想引入到 B/S 界面的自动生成上是不是也是个不错的思想呢, J

<o:p> </o:p>

目前对 RCP 了解还不是非常的多,设计角度而言最让我心动的就是上面的两个理由,但其实 RCP 还提供了非常多的细节的可参考的东西,那都是非常值得学习的, RCP 的代码非常的值得一读,相信大家在读了后都会觉得不亚于一顿大餐美食,希望大家多多挖掘,共同分享这顿难得的美食。

分享到:
评论
12 楼 chn217 2007-01-25  
OSGI还是不错的,两年前在IBM的时候就热火朝天。不过OSGI应该存在不少年了吧,是不是咱们对技术都后知后觉了一点。
11 楼 huangpengxiao 2007-01-24  
满江红上有OSGI 的 OPENDOC
10 楼 cngump 2007-01-24  
RCP是有点学习曲线。不过收获也是有曲线的。。。 努力学习中。。。。
9 楼 agile_boy 2007-01-19  
rcp还是太复杂了,从入门到上手,要个把月时间吧 ;)
8 楼 BlueDavy 2007-01-18  
<p><br/>
呵呵,嗯,多谢zhufanamo,我那张图就是个简单的示意图,:),重点还是为了说明RCP的设计思想...</p>
<p>不过你给的图和所说的东西让我受益颇多。</p>
7 楼 BlueDavy 2007-01-18  
<p>
anders0913 写道
能把RCP和OSGI的概念说明一下就更好了,学习了。
</p>
<p>简单的说,RCP是基于OSGi而构建的一个富客户端应用的开发平台(类似VB、Delphi等),由于是基于OSGi,所以它具备了OSGi所支持的插件化、动态化的特征。</p>
6 楼 zhufanamo 2007-01-17  
<img alt=''/><img alt=''/><img src='http://www.iteye.com/topics/download/e8dd7fa3-7177-45d0-8663-9edfad95b09d' alt=''/><br/>
楼主的rcp结构有些问题.... 少了一层<br/>
eclipse 中的概念还是很多的...viewsite viewpart 等等.... 大家可以上eclipse的网站看找到相应的介绍文档<br/>
<br/>
<br/>
eclipse中的交互性设计很好.,也有很多现成的骨架代码..如selectingservice .可以做到view之间的无偶合交互...<br/>
<br/>
btw: osgi与hibernate的问题.大看可以参考erylee的blog ,他已给出不错的解决方式 最简单的就是用osgi 的dynamic-import方式<br/>
<br/>
列用eclipse 的extension point 的机制也能很好的把eclipse与spring结合起来...这需要用到eclipse 的专有描述eclipse_buddy<br/>
这个大家可以在ibm的opensource中找到相应的文档...<br/>
5 楼 dearwolf 2007-01-17  
非常赞赏BlueDavy的文笔,很适合做技术传播者啊
4 楼 partech 2007-01-17  
Eclipse RCP里面还可以学到Model和View分离的实现。
虽然,在速度和吃内存方面还需要改进。但作为客户端还是能满足实际要求的。
3 楼 anders0913 2007-01-17  
能把RCP和OSGI的概念说明一下就更好了,学习了。
2 楼 过河卒 2007-01-17  
楼主能不能简单介绍一下RCP 和 OSGI ?
1 楼 zexunlee 2007-01-17  
我读完了,受益良多,谢谢楼主。

相关推荐

    RCP,RCP开发

    **RCP(Rich Client Platform)与OSGI详解** **RCP概述** RCP,全称为Rich Client Platform,是由Eclipse基金会开发的一种软件框架,主要用于构建功能丰富的桌面应用程序。RCP提供了一个灵活的基础平台,允许开发者...

    RCP在线升级,RCP在线升级

    RCP(Rich Client Platform)是Eclipse开源框架的一部分,它为构建桌面应用程序提供了一个灵活的平台。RCP在线升级是指在不卸载原有版本的情况下,通过网络更新来安装RCP应用的新版本,以确保用户始终能够使用最新...

    RCP-1500中文操作手册.pdf

    索尼公司生产的RCP-1500系列遥控面板(包括RCP-1500、RCP-1501和RCP-1530型号)是用于配置和控制演播室级及广播级摄像机的专业设备。这些设备提供了高级的操作便利性和功能的多样性,使得用户能够高效地进行摄影机的...

    Eclipse Rcp

    Eclipse RCP是一种基于Eclipse平台的富客户端平台技术,它允许开发者创建独立于Eclipse环境的Java桌面应用程序。RCP通过提供一套标准组件和API,简化了桌面应用程序的开发流程,使开发者能够专注于业务逻辑而非界面...

    eclipse RCP Plug-in开发自学教程.pdf

    4. 向一个RCP应用程序产品中添加标志和帮助 每一章都基本独立于其他章节,读者可以根据自己的需求选择学习的章节。所有的代码均可直接运行,适合Eclipse开发者参考。 在学习本教程时,读者需要具备基本的Java基础...

    RCP项目导出exe 步骤

    RCP导出EXE 老大难问题。 RCp 程序导出步骤,保证能够导出~

    RCP 开发实例 源码

    **RCP(Rich Client Platform)开发实例源码详解** RCP,全称为Rich Client Platform,是Eclipse基金会推出的一种客户端应用程序开发框架。它为开发者提供了一个可扩展的平台,用于构建功能丰富的桌面应用,具有...

    Eclipse RCP 软件打包发布方法

    Eclipse Rich Client Platform (RCP) 是一个强大的框架,用于构建桌面应用程序。它提供了一整套工具和功能,使得开发者可以构建出具有丰富用户界面的应用。在开发完成后,我们需要将这些应用打包并发布,以便用户...

    RCP弹出日期控件

    这种控件不仅允许用户通过点击按钮弹出一个日历视图,还可以在该视图中轻松切换至上一月、下一月,向前或向后滚动一年。这种设计考虑到了用户的直观操作习惯,避免了让他们手动输入具体日期的繁琐过程。 在...

    rcp for java one

    【标题】:“rcp for java one” 指的是在Java平台上使用 Rich Client Platform (RCP) 技术开发的应用程序,通常是在JavaOne大会上讨论的主题。JavaOne是Oracle主办的年度盛会,聚焦Java技术的最新发展和创新,吸引...

    EclipseRCP教程

    Eclipse RCP 教程 Eclipse RCP(Rich Client Platform)是一种基于 Eclipse 平台的客户端开发技术,能够帮助开发者快速构建功能强大且界面美观的桌面应用程序。在本教程中,我们将详细介绍 Eclipse RCP 的开发过程...

    RCP 产品介绍图片

    【RCP产品介绍图片】是针对RCP(Rich Client Platform)技术的一种视觉呈现方式,它通过图像化的形式向用户展示了RCP平台的核心特性和应用场景。RCP是Eclipse基金会推出的一种构建桌面应用的框架,其全称为富客户端...

    Eclipse RCP开发教程

    对话框用于向用户提供交互式界面,收集用户输入或显示警告信息。RCP 提供了多种预定义的对话框,同时支持自定义对话框的创建。 **7. 外部 JAR 的使用** RCP 应用可以引入外部 JAR 包来扩展其功能,只需在项目的类...

    eclipse RCP mp3工程

    【标题】"eclipse RCP mp3工程"指的是一个基于Eclipse Rich Client Platform(RCP)构建的专门处理MP3音频文件的应用程序。Eclipse RCP是一个强大的开发框架,允许开发者创建桌面应用,它提供了丰富的用户界面组件和...

    RCP 界面布局实例

    在IT行业中,RCP(Rich Client Platform)是Eclipse框架的一部分,它提供了一种构建桌面应用程序的强大工具。RCP界面布局实例着重于如何在RCP应用程序中有效地组织和管理用户界面元素,使得用户能够高效地与应用进行...

    rcp学习好资料

    5. **使用Eclipse RCP进行桌面程序开发(六):向OpenGL进军 - 海边沫沫 - BlogJava.mht** OpenGL是一种强大的图形库,用于创建复杂的3D图形。这篇文章可能涉及如何在Eclipse RCP应用中集成OpenGL,为用户提供高级...

    Eclipse的RCP开发的入门教程

    最后,"使用Eclipse RCP进行桌面程序开发(六):向OpenGL进军.doc"将带领开发者进入更高级的主题,即如何在RCP应用中集成OpenGL,实现高性能的3D图形渲染。这对于需要强大图形处理能力的应用来说是至关重要的。 ...

    rcp.zip_DEMO_RCP dialog_java rcp_rcp

    这个"rcp.zip_DEMO_RCP_dialog_java rcp_rcp"压缩包显然是一个针对RCP初学者的学习资源,包含了几个示例项目,帮助用户理解和实践RCP的基本概念和技术。 首先,我们要关注的是"demo_rcp_dialog"。在Java RCP中,...

Global site tag (gtag.js) - Google Analytics