`
cloudtech
  • 浏览: 4609737 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

EMF学习笔记5——模型变动通知

 
阅读更多

当我们使用TableViewer或TreeViewer时,每当其input值发生改变,通常要调用视图的refresh方法来执行刷新操作,而使用EMF模型作为视图组件的文本提供器和标签提供器,却可以省略refresh操作。

当构建AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象时,需要传入所需要的适配器工厂类,该适配器工厂类实现了IChangeNotifier接口定义的3个方法,起到了监听器的作用:
addListener(INotifyChangedListener notifyChangedListener):添加监听者
removeListener(INotifyChangedListener notifyChangedListener):删除监听者
fireNotifyChanged(Notification notification):对监听者执行通知操作

而同时AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象都实现了INotifyChangedListener接口,因此在构造方法中,便可将自己注册成为适配器工厂类的监听者:

这样,当适配器工厂类执行fireNotifyChanged方法时,便可将模型改变通知到AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象,执行它们的notifyChanged()方法:

由代码可以看出AdapterFactoryContentProvider和AdapterFactoryLabelProvider对象还记录了它们所对应的视图viewer,并在notifyChanged方法中对视图执行了刷新操作。

然而回到上一步,适配器工厂类的fireNotifyChanged方法又是在什么时候触发的呢?

当EMF实体类的类结构发生变化时(如:对某一个属性执行了set方法),会调用eNotify(Notification notification)方法来触发其适配器类的通知操作:

而EMF模型适配器类的构造函数中同样传入了adapterFactory适配器工厂类,这样在模型适配器类的notifyChanged方法中,便可进行如下处理:

以此来触发适配器工厂类的fireNotifyChanged方法。
整个模型改变通知的类图大致如下:

model change notification

1、当模型实体类Company的类结构发生变化时,会触发其适配器类(CompanyItemProvider)的notifyChange()方法;
2、模型适配器类会调用其适配器工厂类的fireNotifyChanged方法,来触发监听器的通知;
3、适配器工厂类对它的监听者(AdapterFactoryContentProvider)进行通知,执行他们的notifyChanged方法;
4、AdapterFactoryContentProvider对象中会执行视图的刷新操作。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics