2009-09-28 34 views
0

我有一個應用程序對數據庫執行多個查詢(query1,query2,query3),檢索數據,然後發佈該數據。適當的設計

我設計它的方式是:

a。有一個封裝了連接的DB類,查詢執行,將結果集轉換爲POJO。

b。知道如何發佈pojo的發佈者類。

c。一個控制器,在開始時,執行一個然後將輸出提供給b。

public void start(){ 
    List<DataPojo> pojoList = db.executeAndRetrieveResult(); 
    for (DataPojo p : pojoList){ 
     publisher.publish(p); 
    } 
} 

d。包含控制器列表的管理器。當被調用時,迭代並要求 控制器啓動。

public void start(){ 
    for (Controller c : controllerList){ 
     c.start(); 
    } 
} 

該應用程序的生活很簡單,因此很好。

但是現在我需要做一個改變,將query1, 中的數據與query2中的數據結合起來,然後發佈它。

以前,控制器是同質的。它們之間的差異 被封裝在它們執行的查詢中(使用Db類)。

但是,現在我需要知道哪個控制器正在執行哪個查詢,所以我知道 在哪裏得到query1和query2的輸出。

是一種設計模式,我可以使Controller1和Controller2交互,同時仍然保持它們相對鬆散耦合?

乾杯

回答

2

人們在這裏做的常見事情是將應用程序分爲幾層。 「底層」(或最接近數據庫的層)只與數據庫交互並處理簡單的數據庫實體。如果這還不夠,那麼通常會有一個「業務層」,您可以將邏輯用於組合數據實體,包裝從原子數據庫實體組合構建的對象等等。

前端,無論它是什麼,都與業務層進行交互。重點是避免混合業務邏輯(數據庫實體如何組合)與數據庫邏輯(獲取和設置單個數據庫實體的值)。

作爲一種模式,您可以在「3層」或「N層」設計標題下找到相關討論。

1

我會爲你的查詢創建一個包裝接口,就像QueryExecutor,然後有兩個實現。一個simpleQueryExecutory只是像你一樣執行一個查詢,還有一個MultiQueryExecutory或LinkedQueryExeutor(或者你知道這個想法),它接受兩個相關的查詢。

讓您的MultiQueryExecutor類執行兩個查詢,然後在返回現在組合的已發佈數據之前執行您的發佈查詢處理邏輯。

這也爲您設置了各種可能的靈活查詢執行方式,例如StopOnFirstResultsMultiQueryExecutor,您可以在其中爲查詢列表提供查詢,但它會停止併發布第一個查找結果> 0的結果。這只是我頭頂的一個例子,但希望它能夠得到重點。