以下内容来自http://www.vogella.de/articles/EclipseDataBinding/article.html,如需要例子代码,请到这个地址下载。
一般数据库驱动的业务应用程序分成以下三个层次:
*数据库层
*业务或域模型层
*表现层
层与层之间的交互主要表现为数据在层间的流动。
目前,Hibernate, JPA等ORM技术已成为一个自动化业务层和数据库层之间数据流的流行方式,但业务层与表现层之间的数据交互没有统一的处理方式,大多是手工编写代码来处理。就像Hibernate帮助自动处理业务层和数据库层之间的数据流,Eclipse的JFace的数据绑定方式能帮助自动业务层和表现层之间的数据流。它通过一个简化的MVC模式,创建一个完全通用的、可重复使用的业务层与表现层之间的控制器。
传统的MVC模式,如下图所示:
这种模式工作方式如下
1、 表现层(View)观察(或监听)模型层(MOdel)的变化,当它发现模型变化时,表现层相应的进行更新界面;
2、 控制器(Controller)观察(或监听)表现层的变化事件(如用户在界面上进行操作);
3、 当控制器(Controller)接收到一个变化事件时,它改变模型,而模型改变,根据第一条,表现层也跟着变化。
这个方式存在如下两个问题
1、 表现层需要了解模型层
2、 控制器需要了解表现层与模型层
如果我们采用数据绑定的方式,比如文本框绑定到对象的一个属性,我们知道业务模型层中的数据类型是不匹配的,只要建立一个模型(POJOs)与表现层(GUI控件)匹配的工具,就象Hibernate用于匹配POJOs与数据库。
数据绑定的设计示意如下:
这种实现比较简单,用控制器(Controller)作数据绑定工具,它监听模型(Model)与表现层(GUI视图)的变化,当模型的一个属性改变时,属性值自动的拷贝到GUI视图,类似的,当用户改变GUI控件的值时,变化后的值自动拷到模型中。
现举一个文本控件与对象属性绑定的例子,代码如下:
DataBindingContext bindingContext = new DataBindingContext();
IObservableValue widgetValue = WidgetProperties.text(SWT.Modify)
.observe(firstName);
IObservableValue modelValue = BeanProperties.value(Person.class,
"firstName").observe(person);
bindingContext.bindValue(widgetValue, modelValue);
说明:第3行,firstName这一文本控件,它和Persion类的一个对象person的firstName属性绑定,2-5行就是构造了两个可监听的对象,DataBindingContext 是Eclipse提供的数据绑定工具,bindingContext.bindValue(widgetValue, modelValue);这句在这两个两个可监听对象之间建立了联系。
数据绑定实现如下图所示
从上图可以看出,数据绑定的处理是通ValueBinding的实例来处理的,它有一个doUpdate方法来自动来同步对象与控件显示。
现在来看一下Eclipse 中org.eclipse.core.databinding的类图,如下:
可以看出,上面的例子用到的是ValueBinding,还用两个SetBinding与ListBinding是用来处理集合类的。
JFace的数据绑定方式,还涉及到一个重要的对象,可监听对象,位于包org.eclipse.core.databinding.observable.value中,类图如下: