Swing是纯Java写的图形用户界面。JDK1.5 以前的Swing,耗资源、性能低下、不美观等诸多原因,无论 Sun 如何宣传,也很少有开发者去关注它。自从 JDK1.5 的出现,无论从性能还是外观 Swing 都发生了巨大的变化,人们眼中的丑小鸭渐渐地变成了白天鹅。
相对Web应用来说,我更喜欢开发桌面程序。以前也开发几个应用。不过每次都会有这种感觉 — 总是写一堆控制程序启动和加载各种资源的类,还有一组数据库管理类和一堆程序界面和 Widget 类。然后就是老套路,为每个界面对应一类,用来实现应用程序的业务逻辑。每次有较新颖的想法准备开始动手时,上面这一堆机械式地开发方式总是让我提不起精神。唉!程序设计不是如此简单。
Grape是我最近在写的程序,用来管理个人知识的知识库系统,基于Swing的应用。Grape采用了MVC的基本思想(其实 Swing 本身的设计思想就是经典 MVC 设计的完美实现)和领域驱动设计思路,将表现层与业务逻辑层尽可能地分离,并制作了底层框架来管理应用程序的生命周期、事务以及对象之间的依赖关系。
首先让我们先来简单回顾一下Swing经典的MVC设计。在Swing中,每个组件都是由Model、View和Controller组成的,它们都是独立存在且可以被改变的,例如可以把同一个Model注册到多个View上使用。这种设计方法使对象更加单纯,更灵活和更易复用。JButton的View部分只负责提供人机交互界面,Model维护着组件状态和行为,当然,它并不需要知道自己被注册给了哪个View,由Controller来管理它和View之间关系。用户用鼠标点击这个按钮,Model开始得到响应,通过Controller告诉View改变。每个Swing的应用程序都是由很多这样的组件组成的,那么我们为什么不能扩展单纯Swing组件来完成业务需求呢?这样表达可能会引起误会,我想说的是,我们可以为组件提供一组Model来扩展,并将扩展后的组件视为业务的一部分。举个例子可能比较易懂。例如大家都非常了解的用户登录机能。用户自然是这个业务中的主角,但是问题来了,作为用户他们当然知道自己姓甚名谁,何许人也,而程序中的用户对象却是很泛的,他代表了使用该系统的任何用户。如果我们不告诉他,他是谁,那么他将永远不知道自己是谁。于是不得不提供一个登录界面为其提供信息。界面上包括了一个ID输入框,一个密码输入框和一个确认按钮。当确认按钮被按下后,登录操作被触发开始执行。为了让按钮能够做出正确的响应,我们为其写了事件对象LoginAction。当系统启动时,LoginAction被注册到确认按钮上。这时只要按钮被按下LoginAction即被调用。LoginAction并不知道业务细节,所有的秘密都被封装到诸如用户等这些领域对象中。LoginAction负责协调这样对象,使其能够相互配合完成登录工作。这样一来,我们的程序基本结构就出来了 – View:一个用来装配各组件的Frame,一个用户ID TextBox,一个密码TextBox以及触发登录业务用的确认Button。Model:响应确认Button的事件的LoginAction。还有最重要的业务的实现细节User、LoginValidate等领域对象。如果想要加以完善,可以为用户ID和密码TextBox对象注册用来验证输入格式是否合法的Action对象。若有个用户注册业务,我们也许可以重用很多对象。

| 五冠 Nokia/诺基亚 5230 5230XM 送证书V20版 内有港行 销数千台 | ||
| 1000.0元 | ||
| 批发 雷朋3025镜面反光太阳镜 太阳眼镜 19.9/副 顶级质量 | ||
| 19.9元 | ||
| 促销笔记本电脑 13.3英寸超薄N450无线网卡视频 | ||
| 1999.0元 | ![]() | |





