2010-10-16 58 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