指南:为 J2EE 应用程序设计子系统
主题
简介
这些指南使用特定于 J2EE 应用程序开发的指南补充指南:设计子系统。阅读这些特定于 J2EE 的指南之前,建议您阅读“指南:设计子系统”。这些指南适用于比单个 EJB 粒度更大的设计子系统。关于 EJB 的指南,请参考指南:Enterprise Java Beans。
还要注意将应用程序客户机认为是专门的设计子系统。请参阅指南:应用程序客户机。
不断发展的设计子系统
当第一次标识子系统时,它可能最初是技术中性的。即,可以使用接口、文本描述以及一些描述操作期望行为的状态机来指定它。但是,这种技术中性的子系统通常会发展成特定于技术的表示法。
下面给出了一个示例,说明一个技术中性的设计子系统如何发展成特定于技术的子系统。
子系统规范(子系统的黑匣视图)
最初可以将子系统规范建模成具有抽象 UML 接口。
考虑“客户”子系统的初步设计,如图 1 中所示。

图 1:初步设计-客户子系统
进一步定义 ICustomerMgt,使其具有操作,例如“getCustomerDetails”和“setCustomerDetails”。
随着设计变得更详细(活动:子系统设计),这些抽象的接口将被特定于语言和技术的元素所取代。(您可以选择维持更抽象的子系统模型,例如如果需要以多种语言或技术实现相同设计。请参阅概念:从设计到代码的映射以获取这些选项的讨论)。将更新对应的设计用例实现以匹配接口更改。
在该示例中,图 2 是“客户”子系统的黑匣或规范视图。之后的设计声明“客户”子系统应该是一个实体 EJB。将初步的设计子系统转换成 EJB 接口,如下所示:
- ICustomerMgt =>
- CustomerHome ?EJBEntityHomeInterface?
- ICustomer =>
- Customer ?EJBRemoteInterface?

图 2:“客户”设计子系统的黑匣视图
设计子系统显露的接口可能包括常规 Java 接口、EJB 接口(例如 Java 接口)、EJB 接口(远程和本地)或甚至一个或更多委托或访问类(这些类完全隐藏一个或更多 EJB 的存在)。注意将所有这些(包括 Java 接口)建模为 UML 类而非 UML 接口(请参阅指南:J2EE 应用程序的接口)。例如,通常将会话 bean 用作访问一组紧密相关的实体 bean 的外观。在该情况中,仅将从子系统导出会话 bean 的接口。
消息驱动的 bean 从目的地(或端点)异步地使用消息。因此,目的地还可能作为包含消息驱动 bean 的设计子系统的“接口”。
注意因为相同设计子系统中的其他紧耦合 EJB 使用本地接口,所以它们出现在子系统实现中的次数要比出现在子系统显露的可视接口中的次数要多。
关于 J2EE 应用程序中的接口的更多信息,请参阅指南:J2EE 应用程序的接口。关于对 EJB 建模的更多信息,请参阅指南:Enterprise JavaBeans。
子系统实现(子系统的白匣视图)
设计子系统只应显露客户机需要的内容。因此,实现 EJB 的类专属于该子系统,并且逻辑上是该子系统实现的一部分。子系统实现可能成为:
- 由一个或更多可视的委托或访问类隐藏的一组协作的 EJB 和类
- 没有其它协作类的单个 EJB
继续先前的“客户”子系统示例,子系统的实现包括:
- CustomerEntityEJB (component) ?EJBEntityBean?
- CustomerBean ?EJBImplementation?
- 附加的帮助函数类
图 3 显示设计子系统的白匣视图(即,在子系统之中)。注意按指南:Enterprise JavaBeans 中所述对 EJB 类建模。子系统的这个内部视图被称为子系统实现。在该视图中,我们看到对于客户端不可见的决策。例如,在该子系统实现中,数据访问对象(Data Access Object,DAO)类使用 JDBC API 访问持久数据。(在另一个设计中,可能已经使用容器管理的持久性)。关于 DAO 类的更多信息,请参阅指南:Enterprise JavaBeans。

图 3:“客户”设计子系统的白匣视图
|