Разработайте шаблон, чтобы попытаться получить данные из нескольких источников в иерархии
У меня есть случай, когда у меня есть несколько источников данных резервного копирования. Под источником данных я подразумеваю абстракцию, например. Файл, NoSql/SQL DB,Diff таблицы, архивы. У меня есть конкретная иерархия для доступа к данным, и я могу отказаться от данных любого источника данных на основе определенных критериев. Теперь мой вопрос, есть ли существующий шаблон проектирования для реализации этого? В настоящее время я думал о двух подходах, но я думаю, что они могут быть улучшены:
for (long id : ptitleIds) {
if(checkIfInValid(id)) {
continue;
}else if (getFromNdi(result, id)) {
continue;
} else if (getFromCimg(result,id)) {
continue;
} else if (getFromPtitle(result,id)) {
continue;
} else {
result.put(id, EMPTY_OBJECT);
}
}
return result;
Другой подход, который я попробовал, короче, но, возможно, его нелегко понять:
for (long id : ptitleIds) {
if(checkIfInValid(id) || getFromNdi(result, id) || getFromCimg(result,id)) || getFromPtitle(result,id)) {
continue;
} else {
result.put(id, EMPTY_OBJECT);
}
}
return result;
В этом случае источники данных являются простыми функциями, вставляя и возвращая true, если данные верны.
1 ответ
Я бы реализовал это как своего рода цепь ответственности. В стандартной цепочке ответственности следующий элемент в цепочке является частью интерфейса для объекта, но вы также можете реализовать аналогичную функциональность с помощью декораторов.
Что бы я сделал, это:
Определить интерфейс для загрузки данных (IDataLoader
) и затем иметь одну реализацию для каждого источника. Тогда есть класс, который связывает 2 реализации вместе (ChainingDataLoader
-> инструменты IDataLoader
), который является декоратором для загрузчика данных, который пытается загрузить с оформленным загрузчиком данных и, если это не удается, он делегирует второму загрузчику. Этот второй загрузчик также может быть ChainingDataLoader
чтобы позволить вам связать столько, сколько вам нужно.