2013-05-04 77 views
1

我正在创建一个由gui,业务逻辑层和数据库层组成的3层应用程序。所有图层都是客户端。三层体系结构 - 从较低层通知gui

根据多层体系结构的定义,只允许调用相同或更低层并返回相同或更高层。

在我的情况下,我在用户点击一个按钮后做了很多数据库查询。我想在我的gui中显示当前查询表的状态字段。

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

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

回答

1

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

  1. 您通过继承java.util.Observer(GUI的层)
  2. 您通过继承java.util.Observable中(DAO-层)创建一个concreate主题创建一个具体的观察者
  3. 您可以将您的具体的观察者对混凝土主题。 (引用下层不违反约定!)
  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); 

    ... 
} 

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

+0

对不起,花了这么长的时间来回复。我想我会使用oberserver模式。但有一件事情感觉不好:我的观察者需要访问gui元素来设置状态,我将这个对象直接访问gui元素传递给dao层。这个可以吗?或者我应该更好地在gui中创建'Observable'并将其传递到dao层,因为它更通用,并且不必对gui元素做任何事情? – 2013-07-04 10:57:11

+0

您可以通过调用Observable实例上的'notifyObservers(Object obj)'将参数传递给观察者。看看:http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Observable.html#notifyObservers%28java.lang.Object%29 – 2013-07-12 15:27:04

0

理想情况下,您应该使用中间层从数据库层通信到UI层,如MVC所建议的那样。但是如果你真的需要按照你的愿望去做,那么在每一层实现Observer模式怎么样。使数据库层Observable,添加UI层和观察者。每当你想更新UI,调用相关的观察者并发送可以被UI消耗和显示的信息。