请考虑以下简单的DAO示例:
public abstract class DAOFactory
{
public abstract AccountDAO getAccountDAO();
public abstract MessageDAO getMessageDAO();
public static DAOFactory getDAOFactory(int whichFactory)
{
// depending on whichFactory
return new SpecificDAOFactory();
}
}
public interface AccountDAO
{
public void add(Account account);
public void delete(Account account);
public int authenticate(Account account); // another source!
}
public interface MessageDAO
{
//other methods
}
除了AccountDAO.authenticate()之外,所有上述方法都必须使用相同的数据源实现。
在其他数据源上可用的身份验证信息,应该可以依次插入(例如,可以是SQL,LDAP等)。同时,认证数据源独立于DAO数据源,即哪个工厂可以是A,B或C,而认证源X或Y.
从界面设计的角度来看,身份验证非常适合AccountDAO。但从实施的角度来看,我感到很不舒服。
什么是更好的设计,它将提供清晰的数据访问层接口和实现?
答案 0 :(得分:1)
数据访问对象往往遵循相同的结构和模式,因此您可能需要考虑创建封装此共享逻辑的更高级别的类。我将以一个例子突出显示,请注意我省略了接口,因为我很少发现它们在DAO级别有用。
基础DAO课程:
public class BaseDAO<T> {
private Class<T> clazz;
public BaseDAO(Class<T> clazz) {
super();
this.clazz = clazz;
}
public T find(Long id) { ... }
public List<T> findAll() { ... }
public T create(T entity) { ... }
public T update(T entity) { ... }
public void delete(T entity) { ... }
}
假设帐户对象的派生DAO
public class AccountDAO extends BaseDAO<Account> {
public AccountDAO() {
super(Account.class);
}
public List<Account> findByAccountStatus(String status) { ... }
}
如您所见,您大大减少了派生DAO中的代码量。使用此设置,您无需使用工厂,只需直接初始化DAO即可。
就您的第二个问题而言,我不会在帐户DAO上放置验证方法。认证应该在更高的抽象级别处理(非常适合服务层),即使它最终从数据访问层检索一些信息。