【问题标题】:3-tier architecture - Notify gui from lower layers3 层架构 - 从较低层通知 gui
【发布时间】:2013-05-04 15:15:12
【问题描述】:

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

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

在我的例子中,我在用户点击一个按钮后进行了大量的数据库查询。我想在我的 gui 中有一个状态字段,显示当前查询的表。

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

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

【问题讨论】:

    标签: java architecture conventions


    【解决方案1】:

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

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

    所以 GUI 会调用如下方法:

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

    DAO 实现应该如下所示:

    DAOImpl#performStatements(java.util.Observer observer){
        String stmt;
        ...
    
        // do insert ...
        observer.update(this, stmt);
    
        ...
        // do update ...
        observer.update(this, stmt);
    
        ...
    }
    

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

    【讨论】:

    • 抱歉这么久才回复。我想我会使用观察者模式。但有一件事感觉不太好:我的观察者需要访问 gui 元素来设置状态,并且我将这个对象通过 gui 元素的直接访问权限传递给 dao 层。这个可以吗?还是我应该更好地在 gui 中创建 Observable 并将其传递给 dao 层,因为它更通用并且不需要与 gui 元素做任何事情?
    • 您可以通过在 Observable 实例上调用 notifyObservers(Object obj) 来将参数传递给观察者。看看:docs.oracle.com/javase/1.4.2/docs/api/java/util/…
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-30
      • 2011-09-30
      • 2010-12-09
      • 2011-01-01
      • 1970-01-01
      • 2011-04-19
      • 2019-03-07
      • 2012-07-21
      • 2015-08-22
      相关资源
      最近更新 更多