《Observer与Command模式在VTK类库设计中的应用研究.pdf》由会员分享,可在线阅读,更多相关《Observer与Command模式在VTK类库设计中的应用研究.pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、西南民族大学学报 自然科学版第 33 卷第 4 期 Journal of Southwest University for NationalitiesNatural Science Edition Aug.2007_ _ 收稿日期:2007-03-19 作者简介:袁杲(1982-),男,成都信息工程学院信息与信号专业硕士研究生.文章编号:1003-2843(2007)04-0972-04 Observer 与 Command 模式在 VTK 类库 设计中的应用研究 袁杲,杨玲(成都信息工程学院电子工程系,成都 610225)摘 要:VTK 作为一套开源的三维可视化开发库在国外越来越被广泛使用.
2、但国内对 VKT 内部机制研究相对较少,因而应用受到了限制.Observer和Command是软件设计模式的两个分支.灵活的运用这两种模式.提高了VTK的可重用性和扩充性.本文从设计模式的角度,详细阐述了 VTK 中消息事件响应的机制,并对 VTK 这种设计模式的优点进行了分析,最后通过实例说明了 VTK 设计模式的应用.关键词:设计模式;VTK;消息机制 中图分类号:TP392 文献标识码:A 1 Observer/Command 设计模式 在计算机软件设计模式中有六大设计模式,Observer 和 Command 模式是其中比较常用的模式,也是 VTK 设计采用的模式.Observer 模
3、式是一种行为模式,在这一模式中主要针对两个对象 object 和 Observer1,2.一个 object可以有多个 Observer,它定义对象间的一种一对多的依赖关系,当一个 object 对象的状态发生改变时,所有依赖于它的 Observer 对象都得到通知被自动更新.Command 属于对象行为型模式,Command 模式将一个请求封装为一个对象,并提供一致性发送请求的接口.当一个事件发生时,它不直接把事件传递到事件调用者,而是在命令和调用者之间增加一个中间者,将这种直接关系切断,同时两者之间都隔离.事件调用者只是和接口打交道,不和具体实现交互.3,4 作为常用的框架机构,obser
4、ver 设计模式通过注册感兴趣的事件,然后通过回调函数和事件的关联实现.它包括事件注册,事件通告和事件销毁三个过程,如下 UML 图所示:图 1 Observer Registration 和 Observer Notification 过程 2 VTK 中 observer/command 模式的应用 VTK 是一个包含庞大底层算法的类库,在通过 VTK 开发应用程序时候,很多时候必须知道内部算法的状态,比如算法执行的状态信息.为了达到 VTK 底层算法库和上层应用程序的通信,VTK 里面实现了 Observer这一设计模式,Object 作为 VTK 类库中目标对象的基类,它的成员函数如图
5、 2 所示,AddObsever 将一个 observer973袁杲等:Observer 与 Command 模式在 VTK 类库设计中的应用研究 第 4 期 _ 对象插入到 VTK 内部维护的一个队列中,RemoveObserver 将一个指定的 Observer 从内部的队列中删除.RemoveallObserver 将内部队列中的所有 Observer 清空.在 VTK 类库中,Observer 被单独作为一个类层次进行定义,所有从 Observer 继承的子类必须实现其虚函数 Update,从而更新界面的数据对象元素.一个 Observer 就是一个单独对象,在外部观察一个 VTK 内
6、部对象的状态,并随时更新.VTKObjectObserverAddObserver()RemoveObserver()RemoveAllObserver()ObserverUpdate()图 2 VTK 中 Observer 设计模式实现 VTKObject通过注册感兴趣的事件把command和事件联系到一起,然后编写回调函数响应相应事件的发生.command模式的实现将不同的操作请求封装到不同的对象中,通过新添加一个专门维护撤销操作的类,使类库的可扩展性大大提高.例如:VTKRenderer当消息iStartEvent 发生时开始对数据进行渲染而当消息EndEvent发生时停止渲染.Filt
7、ers(VTKProcessObject的子类)响应 StartEvent,ProgressEvent,EndEvent 等消息对数据进行滤波处理.任意一个VTKObject.的实例可以通过调用AddObserver()方法来添加对事件的观察.只需将事件的id和自定义的回调函数进行关联,VTK就能方便的实现消息的处理.VTK 常用的消息和对应的事件如下表 1 所示:表 1 VTK 常用消息事件对应表 VTKObject VTKEvent Filtering Start End Progress Rendering Start End ResetCamera Picking StartPick
8、EndPick Pick events Mouse MouseMove,BTDown BTUp 3DWidgets StartInteraction Interaction EndInteraction 3 VTK observer/command 模式的优点 VTK 使用 Observer/Command 模式使 VTK 的消息相应变得更为简单,类与类间的层次更为简洁,下面以Widget 类为例来说明.EVENT2 EVENT3 EVENT1widget1MouseOperation()KeyboardOperation()widget3KeyboardOperation()MouseOpe
9、ration()widget2MouseOperation()KeyboardOperation()EVENT2 EVENT3widget1MouseOperation()KeyboardOperation()widget2MouseOperation()KeyboardOperation()widget3KeyboardOperation()MouseOperation()WidgetInterfaceObserver()Command()EVENT1(a)未使用 O/C 模式 Widget 间的耦合关系 (b)使用 O/C 模式 Widget 间的耦合关系 图 3 用 O/C 模式进行程序
10、设计,如 b 图所示,各种 Widget 将会扮演 Observer 的角色,所有的 Widget 对象的动作都会直接与中间的一个接口相连接,而各个 Widget 对象之间所有的关联性都将由此事件来处理,一旦接口中第 33 卷 974 西南民族大学学报自然科学版 _ 有数据变更时就会通知各 Observer 需处理其对应的动作,使用这样的方式可轻易达到一种多物件的处理方式,而 Widget 对象也不再有所关联,从而可更容易的维护各种不同 widget 对象,同时能够有效的降低程序在编写时各种 Widget 对象的关联性.4 应用实例 由于 VTK 对 O/C 模式的实现,使 VTK 的易用性大
11、大提高.这里以 VTK 实现三维物体的交互测量功能为例对此加以说明.在 VTK 的三维场景中一般存在两种模型,一种是用于对三维物体操作的 Widget 模型,另一种是在场景中显示的 data 模型.但本身处于三维场景中的 widget 模型是无法自行触动消息响应函数对 data 模型进行控制,要想达到这一目的,需要在它和 data 模型中间设置一个桥梁,这个桥梁就是通过 command 模式实现的回调函数.它就像是一个驱动器,截获从 view中获取的消息,然后驱动 widget 模型对 data 模型进行操作.同时在外部存在一个 Observer 模块对 data 模型进行观察,随时反映 da
12、ta 模型的状态.DatamodelRender()ObserverUpdate()VTKObjectViewOnMouseMove()OnLButtonDown()OnLButtonUp()CommandOnLButtonDown()OnLButtonUp()OnMouseMove()VtkCellPickerRender()OnMouseMove()OnLButtonDown()OnLButtonUp()Select()VtkConeSourceRender()图 4 三维交互式测量各模块间关系图 在三维测量功能实现过程中,VtkPicker 类就属于 widget 模型,而它要测量的对象
13、 VtkConeSource 则属于data 模型.如图 3 所示,Observer 把 VTKPicker 拾取到的相关数据模型的几何和物理参数以合适的方式显示出来.由于每个object对象都能够添加多个Observer对象,从objcet中派生出来的VtkPicker也不例外.当vtkpicker中的参数更新的时候,observer 对象也通过 update 接口对数据进行更新,由于 update 是一个抽象接口,具体实现会由用户来定义.在三维场景中用户只看到 VtkPicker 和 VtkConesource,场景中所截获的操作系统发送的鼠标键盘消息都会由 command 模式所实现的回
14、调函数来实现,这就实现了三维模型的交互式测量.图 4 为三维交互测量显示结果.(a)三维测量 (b)三维体旋转测量 (c)三维放大测量 图 5 三维交互测量显示结果 图(b)(c)分别对应三维球体经过旋转,放大操作后的结果,在 Observer 的作用下,测量点也随着这些操作更新.因此 Observer 和 Command 模式的运用提高了三维软件设计的交互性和实时性.975袁杲等:Observer 与 Command 模式在 VTK 类库设计中的应用研究 第 4 期 _ 5 结论 Observer 和 Command 模式是计算机软件设计中比较常用的模式.VTK 作为一个扩张性良好的三维图像
15、重建的专业类库,通过应用 observer/command 模式可使程序设计变得更为容易,提高软件质量和开发效率.同时根据VTK 的设计模式可以容易的对其类库进行派生扩展.用户可以根据自己的需求对类库进行扩张,以实现软件设计的功能.对本文结合实例,从设计模式的角度深入探讨了 VTK 消息机制的实现过程,从而加深对 VTK 类库的消息机制理解.参考文献:1 唐泽圣.三维数据场可视化M.北京:清华大学出版社,1999.2 ERICH GAMMA,RICHARD HELM,RALPHJOHNSON,et al.设计模式可复用面向对象软件的基础M.李英军,马晓星,等译.北京:机械工业出版社,2000.
16、3 关拮红.基于软件重用技术的软件开发方法研究J.计算机与现代化,2000(1):77-81.4 田捷,赵昌明,何晖光.集成化医学影像算法平台理论与实践M.北京:清华大学出版社.Research on Observer and Command pattern in VTK class libraries design YUAN Gao,YANG Ling(Department of Electronic Engineering,Chengdu University of Information Technology,Chengdu 610225,P.R.C.)Abstract:With the
17、 development of three-dimensional image reconstruction,VTK is widely used in foreign countries,as an open resource of 3D visualization tool kits.However,VTK internal mechanism has been studied relatively less in domestic,thus the application has been limited.Observer and Command are two branches of
18、software design pattern.Flexible application of these patterns makes reusability and scalability of VKT greatly improved.The paper expatiates on the mechanism of message and event in VTK from the view of design patterns in detail.And the advantages of the design pattern used in VTK have been analyzed.Finally,an example is given to explain the application of design patterns in VTK.Key words:design pattern;VTK;message mechanism