1

我正在用 java 创建一个 3 层应用程序,它由一个 gui、一个业务逻辑层和一个数据库层组成。所有层都是客户端的。

从多层架构的定义来看,它只允许调用相同或更低的层并返回相同或更高的层。

就我而言,在用户单击按钮后,我正在执行大量数据库查询。我想在我的 gui 中有一个状态字段,其中显示了当前查询的表。

因为所有层都在同一个应用程序中,所以我可以只从数据库层调用一个方法,同时遍历表来更新状态字段。但这样做会打破只调用较低层或同一层的规则。

那么在 3 层架构中从较低层更新或通知 gui 的“合法”方式是什么?

4

2 回答 2

2

我建议使用观察者模式。通过使用java.util.Observable类(作为主题)和java.util.Observer接口,您仍将保持约定。

  1. 通过子类化 java.util.Observer(GUI 层)创建一个具体的观察者
  2. 通过子类化 java.util.Observable (DAO-Layer) 创建一个 concreate Subject
  3. 您可以将您的具体观察者附加到 concreate 主题。(引用较低层并不违反约定!)
  4. 通过将 concreate 观察者实例委托为 java.util.Observer 类型,单击按钮调用所需的方法(业务层或 DAO 层)。因此 DAO 层将永远不需要引用 GUI 层。

所以 GUI 调用一个方法,如:

BusinessImpl#doDAOStuff(java.util.Observer observer){
    ...
    dao.performStatements(observer);
    ....
}

DAO impl 应该如下所示:

DAOImpl#performStatements(java.util.Observer observer){
    String stmt;
    ...

    // do insert ...
    observer.update(this, stmt);

    ...
    // do update ...
    observer.update(this, stmt);

    ...
}

这只是伪来源,但我认为它涵盖了主要概念。

于 2013-05-04T16:06:01.823 回答
0

理想情况下,您应该按照 MVC 的建议使用中间层从 db 层到 ui 层进行通信。但是如果你真的需要做你想做的事情,那么如何在每一层实现观察者模式。使 DB 层可观察,将 UI 层添加为观察者。每当您想更新 UI 时,调用相关的观察者并发送可以被 UI 消费和显示的信息。

于 2013-05-04T15:37:19.877 回答