2010-10-16 59 views
2

我需要一個建議w.r.t.我們正在考慮的設計方法之一。使用DAO作爲命令

我們正在實施一個Java Web服務提供者,它對關係數據庫中的數據起作用。我們的提議類是:

  1. IDAO - 與execute()方法
  2. GetCustomerDAO和UpdateCustomerDAO實現IDAO
  3. DAOFactory接口 - 列出DAO的是讀取其具有的DAO的映射被調用用於配置文件一項特定的服務。
  4. ServiceImpl - 包含getCustomer,updateCustomer方法。該服務使用DAOFactory來獲取DAO對象列表,然後遍歷該列表並調用DAO.execute方法。

我認爲這更像是我們將DAO轉換爲Command。但是,由於某些原因,我不太喜歡這種方法: - 在ServiceImpl中:您不能影響被調用的DAO流。對於例如如果我不想執行第二個DAO而執行第三個DAO,執行第一個DAO之後,很難實現這個。 - 除了不知道我們是否可以在概念上使用DAO。因爲一個Command對象可以有業務邏輯,但是DAO應該只處理讀寫數據到db的方面。

請讓我知道您的意見是否設計看起來合適。謝謝

回答

4

我沒有看到在這種情況下使用命令設計模式的好處。
1. DAO的想法是提供一個抽象持久性機制的接口。這個接口傳統上定義了CRUD方法。每個DAO具體類,通常都會實現DAO接口,用於特定的持久性機制。例如,您可以有一個將數據存儲到關係數據庫的實現,另一個將數據存儲到xml文件。這兩個實現都可以互換,因爲它們實現相同的界面。
2.服務功能可以分成單獨的服務層。通常,此圖層對DAO圖層具有依賴性(用於持久性)。服務接口可以類似於將應用程序中實現的業務邏輯(通常是業務層中的邏輯)公開給潛在客戶的外觀。例如:
用戶DAO接口:

 
public interface UserDao { 
    void save(User user); 
    void delete(User user); 
    void update(User user); 
    User findByUsername(String username); 
    List findAll(); 
    ... 
} 

用戶服務接口:

 
public interface UserService { 
    void createUser(String username, String password); 
    boolean loginUser(String username, String password); 
    boolean isUsernameUnique(String username); 
    .... 
} 

服務實現:

 
public class UserServiceImpl implements UserService { 

    private UserDao userDao; 

    public UserServiceImpl(UserDao userDao){ 
    this.userDao = userDao; 
    } 
    ... 
} 
+0

感謝沃爾TER值。所以你的建議基本上是直接調用ServiceImpl中的DAO方法。我喜歡這種方法。 – Rohit 2010-10-18 15:37:37

+0

是的。服務層將持久性委託給DAO(使用依賴注入)。 – walters 2010-10-19 08:24:09

+0

@Walters能舉出一個來自UserServiceImpl的方法之一的業務層類的例子嗎? :) – will824 2012-03-05 14:51:06