Eclipse RCP WizrdPage动态实现方法

Eclipse RCP WizrdPage动态实现方法

An dynamic realization for Eclipse RCP WizrdPage

WANG Shun-Yan, KANG Lei,HUANG Sha Li,

[1] School of Computer Science and Technology,Wuhan University of Technoloty,Wuhan 430070,China

[2]Department of Information Engineering,Hubei Technical College of city construction

Abstract:

For Solving the limited function problem that each input page with the Eclipse RCP WizardPage static realization failed to solve the data association, this article has analyzed the WizardPage movement mechanism and the dynamic realization's technical difficulty, proposed one kind of dynamic realization method based on obserber pattern of Eclipse RCP the WizardPage and in doing so lows the service object's coupling, makes the logic to be clear and has laid a good foundation for the code maintenance as well as the service expansion. Finally it gave the representative demand model and the realization code for the service.

Keywords: Eclipse RCP;WizardPage;dynamic realization; obserber pattern;

0.引言:

RCP (Rich Client Platform) 称为富客户端。Eclipse RCP,就是在Eclipse平台上,通过构建插件(Plug-in)来建立的RCP应用。每个RCP应用至少需要实现一个扩展点(extension point),在众多扩展点中,WizardPage 扩展点实现输入向导功能。静态实现的WizardPage简单易用,但功能相对简单。当输入各页面数据关联,要求根据当前页的输入内容动态调整上下页的显示时,静态设计的WizardPage就无能为力了。复杂的业务输入需要我们动态实现WizardPage。

1WizardPage的运行机理和动态实现的技术难点: 1.1

WizardPage运行机理

王舜燕 (1957-), 男,江苏吴江人,副教授,硕士研究生导师 ,主要研究方向:网络数据库,计算机智能

技术;

康磊 (1978-) 男,湖北武汉人,硕士研究生 ,主要研究方向,网络数据库; 黄莎莉 (1979-) 女 ,湖北武汉人,讲师,主要研究方向:电子商务;

一个输入向导由若干WizardPage类(负责实现各输入页面)和一个Wizard类(负责管理调度WizardPage)组成。调用输入向导时,将生成Wizard类实例。在Wizard的构造方法中,首先将各WizardPage类一一实例化并加载,然后重叠显示在当前界面上。除了当前向导页面正常显示外,其他WizardPage页面透明显示。当点击当前向导页面上的“上一页”,“下一页”按钮时,Wizard将当前页面透明显示,再将指定页面正常显示。

1.2 WizardPage动态实现的技术难点

在Web页面中点击提交或转向按钮后将即时生成下一个页面,所以Web动态实现只用保证每次页面装载的数据是最新数据就可以了。

WizardPage就完全不一样了,从其运行机理可知,WizardPage动态实现需要在当前WizardPage页面的

输入数据发生变化时即时改变所有关联页面的显示。

因此,WizardPage动态实现要解决两个主要的问题: 一.如何完成关联页面的数据模型变更; 二.如何完成关联页面的显示视图刷新;

2基于观察者模式的WizardPage动态实现方法: 2.1观察者模式简介

观察者(Observer)模式是对象的行为型设计模式,又叫做发表-订阅(Publish/Subscribe)模式。观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。观察者模式的主要作用是将对象解耦,降低对象间的耦合。

2.2观察者模式在动态设计中的作用

本文提出的动态设计方法中引入观察者模式是为了更好地解决上述技术难点。实际上,这两个技术难点并非唯一解决方案。

面向过程设计的解决方案可能是这样的:为当前WizardPage页面的显示部分添加监听器,再设计一个调度函数。当界面输入变化时,调用调度函数来更改关联页数据模型,并刷新视图,这样就可以实现关联页“数据模型变更”和“显示视图刷新”。但是,这种基于页面监听和调度函数的解决方案存在着一些不足:由于调度函数对于其他对象操作过多,造成代码的耦合度高,伸缩性不佳,不利于代码重构和再次开发。

从面向对象设计的观点来考虑,各对象应该“自己对自己负责”,从而降低耦合度,

增加代码的灵活性和可扩展性。因此,较合理的解决方案是对当前WizardPage页面的数据模型监听,当数据模型发生变更,监听模块向各关联页面通信,让其自己完成数据模型的更新和页面视图刷新工作。这正是运用观察者模式所带来的效果。

2.3观察者模式在动态实现中的工作机制:

Java提供了一个Observable类以及一个Observer接口,构成Java语言对观察者模式的支持。Observer接口和Observable类的类图结构如图一,图二:

图一 图二

Eclipse RCP WizardPage动态实现中运用观察者模式,把各关联页作为观察者,实现Observer接口.update()方法具体内容主要是调用Jface工具箱中视图小部件的刷新或重绘方法,完成自身显示视图的刷新

功能.

当前WizardPage页的数据模型作为被观察者, 继承Observable类. 被观察者把各关联页面实例用addObserver(Observer o)方法添加进观察者列表。当数据模型更新时,setChanged()方法被调用,它设置一个内部标记变量,表示被观察者对象状态发生变化;然后notifyObservers()方法被调用,它将通知所有登记过的观察者对象调用update()方法,使这些观察者对象可以更新自己。所有视图更新完毕后,ClearChanged()方法将内部标志变量重置,更新结束.

3代表性的需求模型及其实现编码 3.1代表性的需求模型:

为验证本文提出的动态实现方法能解决WizardPage静态实现方法难以解决的“各输入页间数据关联”的问题,需求模型以“各输入页数据关联”为核心内容,具体描述如下:

现有A,B,C,D四个WizardPage构成的输入向导,A页输入所有选课学生,B页输入选数学课学生,C页输入选语文课学生名,D输入没有选课学生;

学生student 只选了数学课,则其在A,B页中出现;

当A页中删除学生student时,B页中删除student,C页不变,D页增加student。

3.2需求模型的实现编码

在动态实现需求规定的WizardPage中, A页的数据模型作为被观察者,继承Observable类. B页, C页,D页作为观察者,实现Observer接口.

3.2.1 被观察者实现:

学生对象的数据模型存放在一种集合里,具体实现时由该集合继承Observable类,重写集合的行为,使其具有通知各观察者的功能;由存放学生对象的该集合实例完成添加观察者列表的工作;其代码为自定义集合文件ArrayListWrapper.java 和对象工厂文件StudentFactory.java:

ArrayListWrapper.java核心代码: //包装类中的ArrayList,做数据存储用; private ArrayList arrayList; public boolean remove(Object o) {

boolean flag = arrayList.remove(o); if (flag) { setChanged();

notifyObservers(Object o);} return flag;} StudentFactory.java核心代码

//用自定义类初始化页面A数据模型groupA;

private List groupA=new ArrayListWrapper ();

//分别将作为观察者的页面B,页面C和页面D加入被观察者内部的通知列表中; ((Observable) groupA).addObserver(pageB); ((Observable) groupA).addObserver(pageC); ((Observable) groupA).addObserver(pageD);

//包装类的删除方法,使删除动作能通知各观察者;

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4