3层架构 - 从较低层通知gui

时间:2013-05-04 15:15:13

标签: java architecture conventions

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

  5. 因此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);
    
        ...
    }
    

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

答案 1 :(得分:0)

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