使用DAO作为命令

时间:2010-10-16 04:22:50

标签: java design-patterns

我需要一个建议w.r.t.我们正在考虑的一种设计方法。

我们正在实现一个Java Web服务提供程序,它可以处理关系数据库中的数据。我们的建议课程是:

  1. IDAO - 与execute()方法的接口
  2. GetCustomerDAO和UpdateCustomerDAO实施IDAO
  3. DAOFactory - 要读取的DAO配置文件列表,其中包含要为特定服务调用的DAO的映射。
  4. ServiceImpl - 包含getCustomer,updateCustomer方法。该服务使用DAOFactory获取DAO对象列表,然后迭代列表并调用DAO.execute方法。
  5. 我认为更像是将DAO转换为Command。但是,由于某些原因,我不太喜欢这种方法: - 在ServiceImpl中:您无法影响被调用的DAO流。对于例如执行第一个DAO之后,如果我不想执行第二个DAO但执行第三个DAO,则很难实现。 - 除了不确定我们是否可以在概念上使用DAO。因为Command对象可以有业务逻辑,但是DAO应该只处理向db读取和写入数据的方面。

    请让我知道您对设计是否合适的看法。感谢

1 个答案:

答案 0 :(得分:4)

在这种情况下,我没有看到使用Command设计模式的好处。
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;
  }
  ...
}