最近看Eclipse RCP稍微了解一下JFace,看了它的MVC架构有感!
在JFace的ContentViewer抽象中下面的三个方法反映它对待模型的思路:
public void setContentProvider(IContentProvidercontentProvider)
public void setInput(Object input)
public void setLabelProvider(IBaseLabelProvider labelProvider)
显然setInput是用来配置view背后的数据,从它的参数类型(Object)来讲应该是你的与view无关的领域模型.
从这里就可以看出它和swing的根本差异.swing各种不同viewer(在swing的世界叫JComponent)背后的模型是因不同组件而不同的,模型的接口是反应了该组件特征的.
如 JTable 背后的TableModel,TableModel接口的定义基本表达了作为一个二维表格期望获得数据的方式如TableModel中有定义这样的方法:
Objetc getValueAt(int row,int column)
在JFace中直接可以放入Object类型数据,但各种viewer不一样对于拿数据的期望也不一样,
ContentProvider,LabelProvider解决了上述问题,不同ContentProvider定义了该viewer所期望的拿数据的接口,其实我觉得swing中的model在意义上类似于ContentProvider.
其实感觉JFace的做法在尽量强制你必须构建独立于GUI的模型.
而swing的话并没有这种侵入性,你可以直接实现viewer的模型接口如
class Mymodel implenents TableModel{
}
也可以定义比较独立的模型然后用对象适配器模式将它们适配到viewer model上!
http://www.douban.com/group/topic/1159250/