我有一个DAO
,(称之为PlayerDao
),方法如下:
public interface PlayerDao{
//Other methods
public Collection<Integer> getPlayerRegisteredIds();
}
现在我需要为该方法提供两个实现:
I 的即可。直接在dataSource上执行select查询,如下所示:
public class PlayerDaoImpl implements PlayerDao{
private DataSource dataSource; //javax.sql.DataSource
//Other methods
public Collection<Integer> getPlayerRegisteredIds(){
Collection<Integer> result = new ArrayList<Integer>();
String query = "SELECT id FROM player WHERE registered_today = true";
//Executing the query with the dataSource
return result;
}
II 即可。按部分执行此查询。我的意思是将查询拆分为4个不相交的部分,并将每个部分执行到一个单独的线程中(为了提高性能)。
public class ConcurrentPlayerDaoImpl implements PlayerDao{
private static final NUMBER_OF_THREADS = 4;
private DataSource dataSource; //javax.sql.DataSource
//Other methods
public Collection<Integer> getPlayerRegisteredIds(){
final Set<Integer> set = Collections.synchronizedSet(new HashSet<Integer>());
//It's going to consist of 4 queries
List<String> queriesToConcurrentExecution = new ArrayList<String>();
//Obtaining the queries
ExecutorService executor = Executors.newFixedThreadPool(NUMBER_OF_THREADS);
for(final String sql : queriesToConcurrentExecution){
executor.execute(new Runnable() {
@SuppressWarnings("unchecked")
@Override
public void run() {
List<Integer> l = new JdbcTemplate(dataSource).queryForList(sql, Integer.class);
set.addAll(l);
}
});
}
executor.shutdown();
return set;
}
问题是//Other methods
的实现在两种情况下都是相同的。所以我倾向于将getPlayerRegisteredIds()
包装到某个接口中,然后为它的构造函数提供相同Dao类的两个不同的实现。这是对的吗?
在official DAO
-pattern's description中说DAO
就像bussines对象和DataSource
之间的适配器,但在我的情况下,它使用一个本身使用dataSource的对象。
问题 :我们是否应始终坚持在DAO中直接使用对象?这是必要的要求吗?
答案 0 :(得分:2)
我认为您打算使用的内容没有任何根本错误:DAO使用的接口和包含该特定方法的接口是策略,DAO将委托给一个或另一个策略实现。
DAO仍然具有包含daa访问方法的角色,并且可以按照自己的方式自由实现,即使这包括委托给其他组件。