最近看Eclipse RCP稍微了解一下JFace,看了它的MVC架構(gòu)有感!
在JFace的ContentViewer抽象中下面的三個(gè)方法反映它對(duì)待模型的思路:
public void setContentProvider(IContentProvidercontentProvider)
public void setInput(Object input)
public void setLabelProvider(IBaseLabelProvider labelProvider)
顯然setInput是用來配置view背后的數(shù)據(jù),從它的參數(shù)類型(Object)來講應(yīng)該是你的與view無關(guān)的領(lǐng)域模型.
從這里就可以看出它和swing的根本差異.swing各種不同viewer(在swing的世界叫JComponent)背后的模型是因不同組件而不同的,模型的接口是反應(yīng)了該組件特征的.
如 JTable 背后的TableModel,TableModel接口的定義基本表達(dá)了作為一個(gè)二維表格期望獲得數(shù)據(jù)的方式如TableModel中有定義這樣的方法:
Objetc getValueAt(int row,int column)
在JFace中直接可以放入Object類型數(shù)據(jù),但各種viewer不一樣對(duì)于拿數(shù)據(jù)的期望也不一樣,
ContentProvider,LabelProvider解決了上述問題,不同ContentProvider定義了該viewer所期望的拿數(shù)據(jù)的接口,其實(shí)我覺得swing中的model在意義上類似于ContentProvider.
其實(shí)感覺JFace的做法在盡量強(qiáng)制你必須構(gòu)建獨(dú)立于GUI的模型.
而swing的話并沒有這種侵入性,你可以直接實(shí)現(xiàn)viewer的模型接口如
class Mymodel implenents TableModel{
}
也可以定義比較獨(dú)立的模型然后用對(duì)象適配器模式將它們適配到viewer model上!
http://www.douban.com/group/topic/1159250/