Разработайте шаблон, чтобы попытаться получить данные из нескольких источников в иерархии

У меня есть случай, когда у меня есть несколько источников данных резервного копирования. Под источником данных я подразумеваю абстракцию, например. Файл, 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 чтобы позволить вам связать столько, сколько вам нужно.

Другие вопросы по тегам