在《Swing程序的基本设计结构》一文中,大概描述了Grape应用程序的基本设计思想,今天我们来简单分析如何管理Swing应用程序的生命周期。
通过《Swing程序的基本设计结构》的分析得知,一个完整的Swing应用程序将由很多组件组合而成,这样做好处是显而易见的。组件是独立的,所以可以独立存在,如同对象一样可以被复用。组件是由领域对象、Action和View组成的。这样做的好处是每一层的任务更加明确,对象更加单纯。领域层封装了各业务的细节(关于领域对象请参照《程序设计不是这么简单》),Action负责指挥各领域对象完成业务操作,View只关心如何更好地与用户交互,对于与用户交互后所发生的一切一无所知。如此便有了应用程序结构的简单模型。
我们说过,组件是由不同层的很多对象组合来完成工作的,对象间是相互依赖的,耦合的。这样的程序结构虽然层次清晰,但不易扩展。由于组件对象间高度耦合,对任意一个进行修改将会对其它对象产生影响。更重要的是对象复用比较困难。一个好的应用程序应对扩展敞开怀抱,对修改紧闭大门(开闭原则)。那么如何管理对象的生命周期,以及怎样为对象解耦是我们需要考虑的问题。Spring为我们带来了一个比较好的解决方案,即将对象的生命周期交给容器管理,利用依赖注入使对象解耦。像Spring这样面面俱到的框架功能无疑是强大非富的,它不但可以使用在WEB应用程序中,也可以在桌面应用程序中很好地工作。不过在这个以简为美的时代,对使用者来说,简单高效绝对是重中之重,Rails的成功就是个很好例子。转回话题,为了使应用程序解耦,我们必须开发一个简单的框架来管理对象的生命周期,也就是说我们需要动态地创建对象实例。Java的Reflection机制可以帮助我们达到此目的。(Reflection性能是令人头痛的,也许Javassist、BCEL是个不错的替代方案。不过,在Grape的第一个版本中,我依然使用了Reflection。因为我并没有打算利用Reflection来创建更多的对象,也没有进行ORM,所以性能不是这个版本所要考虑的问题。)我们能过一段简单的配置来了解Swing应用程序的结构。
- <!– 主窗口 –>
- <view class="mxjava.com.grape.ui.AppWindow" id="appWindow">
- <local id="menuBar"/>
- <local id="toolBar"/>
- <local id="contextEditor"/>
- <local id="statusBar"/>
- </view>
appWindow是应用程序的主界面,它是由menuBar(菜单)、toolBar(工具栏)、contextEditor(编辑器)和statusBar(状态栏)四个组件组成的。应用程序启动时,框架利用Reflection生成这些组件,并通过appWindow暴露的Setter方法将其注入到appWindow中。
- <!– 菜单栏 –>
- <view id="menuBar" class="mxjava.com.grape.ui.MenuBar">
- <local id="menuFile"/>
- <local id="menuEdit"/>
- <local id="menuView"/>
- <local id="menuTool"/>
- <local id="menuAbout"/>
- </view>
menuBar是由多个菜单组成的(有的可能是二级或多级菜单),上例的菜单栏是由File(文件)、Edit(编辑)、View(视图)、Tool(工具)、About(关于)五个菜单组件组成的。
是的,Swing应用程序界面就是这样通过不同的组件组合而成的。还记得吗?每个组件是由View、Action以及领域对象组成的。(注意、这些组合并不是绝对的一对一,很可能一个Action被注册到n个View上,View可会注册多个Action),接下来让我们来看看Action是如何注册到View上的。
- <!– 新建文件 –>
- <view id="newFile" class="mxjava.com.grape.ui.menu.MenuItem">
- <param class="java.lang.String" value="新建"/>
- <action id="createFileAction" class="mxjava.com.grape.action.CreateFileAction">
- <model id="pdfFile" class="mxjava.com.grape.io.PdfFile">
- <param class="java.lang.String" value="UTF-8"/>
- </model>
- </action>
- </view>
在File菜单下,有个newFile的菜单项用来创建新文件。newFile作为View,并不知道如何创建文件,所以我们为其注册了一个用来创建PDF文件的Action — createFileAction。Action的工作是响应View事件,并根据要求创建文件。Action并不做实际的工作,只是象个领导一样,发命令给手下的员工:“我需要创建一个pdf文件,pdfFile这是你的老本行,交给你去做吧“。于是pdfFile轻松地接过命令,瞬间便将领导要的pdf文件创建好了。领导惊奇地拍了拍pdfFile的肩膀说:”果然厉害,你是怎么做到的?”,pdfFile只是笑了笑说到:“我就是干这个的。”pdfFile是领域对象,负责业务处理的细节,不过,它并不是一个人在战斗。通过继承的File,pdfFile成为了真正的File,通过组合的OutputStrame,它拥有了保存到磁盘的能力。
以上就是Grape框架的基本思路和结构,制作它初衷就是希望开发者能够以真正面向对象的思想和MVC结构来进行程序开发,告别以往智能UI的开发方式。以后我将会为大家慢慢展示它的其它特点和思想。
| 五冠 Nokia/诺基亚 5230 5230XM 送证书V20版 内有港行 销数千台 | ||
| 1000.0元 | ||
| 批发 雷朋3025镜面反光太阳镜 太阳眼镜 19.9/副 顶级质量 | ||
| 19.9元 | ||
| 促销笔记本电脑 13.3英寸超薄N450无线网卡视频 | ||
| 1999.0元 | ![]() | |





