Я освежил свои шаблоны проектирования и натолкнулся на мысль, что нигде не могу найти хорошего ответа.Поэтому, возможно, кто-то с большим опытом может помочь мне.
Разве шаблон DAO предназначен только для доступа к данным в базе данных?
Большинство ответов, которые я нашел, подразумевают да;на самом деле большинство тех, кто говорит или пишет по шаблону DAO, обычно автоматически предполагает, что вы работаете с какой-то базой данных.
Хотя я не согласен.Я мог бы иметь DAO следующим образом:
public interface CountryData {
public List<Country> getByCriteria(Criteria criteria);
}
public final class SQLCountryData implements CountryData {
public List<Country> getByCriteria(Criteria criteria) {
// Get From SQL Database.
}
}
public final class GraphCountryData implements CountryData {
public List<Country> getByCriteria(Criteria criteria) {
// Get From an Injected In-Memory Graph Data Structure.
}
}
Здесь у меня есть интерфейс DAO и 2 реализации, одна, которая работает с базой данных SQL, и другая, которая работает, скажем, со структурой данных графа в памяти.Это правильно?Или реализация графа предназначена для создания в каком-то другом слое?
И если это правильно, каков лучший способ абстрагировать детали, специфичные для реализации, которые требуются каждой реализацией DAO?
Например, возьмите приведенную выше ссылку на класс I.Предположим, что это так:
public final class Criteria {
private String countryName;
public String getCountryName() {
return this.countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
}
Для SQLCountryData необходимо каким-то образом сопоставить свойство countryName с идентификатором SQL, чтобы он мог генерировать правильный SQL.Для GraphCountryData, возможно, необходимо создать какой-то объект Predicate Object для свойства countryName, чтобы отфильтровывать вершины из неудачного графа.
Каков наилучший способ абстрагирования таких деталей без объединения клиентского кода, работающего противаннотация CountryData с деталями, относящимися к реализации, как это?
РЕДАКТИРОВАТЬ:
Пример, который я включил в класс критериев, достаточно прост, но подумайте, хочу ли я разрешить клиенту создавать сложные критерии, где они должны не только указывать свойство для фильтрацииon, а также оператор равенства, логические операторы для составных критериев и значение.