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

У меня есть случай, когда у меня есть несколько источников данных резервного копирования. Под источником данных я подразумеваю абстракцию, например. Файл, БД NoSql / SQL, таблицы различий, архивы. У меня есть конкретная иерархия для доступа к данным, и я могу отбросить данные любого источника данных на основе определенных критериев. Теперь мой вопрос: есть ли какой-либо существующий шаблон проектирования для реализации этого? В настоящее время я подумал о двух подходах, но думаю, что их можно улучшить:

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;

В этом случае источники данных представляют собой простые функции, вставляющие и возвращающие истину, если данные действительны.


person Heisenberg    schedule 23.04.2015    source источник
comment
Для меня это звучит как кандидат на схему цепочки ответственности.   -  person Morfic    schedule 23.04.2015


Ответы (1)


Я бы реализовал это как своего рода цепочку ответственности. В стандартной цепочке ответственности следующий элемент в цепочке является частью интерфейса для объекта, но вы также можете реализовать аналогичную функциональность с помощью декораторов.

Что бы я сделал:

Определите интерфейс для загрузки данных (IDataLoader), а затем создайте по одной реализации для каждого источника. Затем у вас есть класс, который объединяет 2 реализации вместе (ChainingDataLoader -> реализует IDataLoader), который является декоратором для загрузчика данных, который пытается загрузить с помощью декорированного загрузчика данных, и если это не удается, он делегирует второму загрузчику. Этот второй загрузчик также может быть ChainingDataLoader, чтобы вы могли объединить в цепочку столько, сколько вам нужно.

person Sam Holder    schedule 23.04.2015