Я пытаюсь улучшить свои навыки с помощью шаблонов дизайна, поэтому, пожалуйста, будьте спокойны на меня :) В своей работе мне часто приходится иметь дело с проблемами, когда алгоритм определен, но структуры данных, над которыми он работает, различны.Какой шаблон дизайна применять?
Предположим, у меня есть класс Counter, которому поручено просто подсчитывать элементы, если они соответствуют определенным критериям (большое упрощение). Эти элементы могут иметь различную структуру, поэтому, например:
- если счетчик работает для «текст» пунктов, я рассчитывать только элемент, если его длина больше, чем X
- , если счетчик работает для " image ", я считаю только элемент, если это изображение в формате JPEG.
Он чувствует себя хорошо (для меня), чтобы иметь AbstractItem
класс, счетчик будет работать, но тогда она также нуждается в связанных с ними AbstractCriteria
, поскольку критерии оцениваются по-разному для каждого типа элемента.
Своего рода псевдо-код:
class Counter
{
AbstractItemFactory factory; // initialized in constructor
AbstractCriteria criteria; // initialized in constructor
DataProvider provider; // initialized in constructor
int count()
{
int result;
while((Data data = provider.get()) != null)
{
AbstractItem item = factory.create(data);
if(criteria.match(item))
{
result++;
}
}
return result;
}
}
Проблема здесь состоит в том, что, конечно, AbstractCriteria
не будет знать, как обращаться с AbstractItem
. Я знаю, что это можно решить, используя метод base-to-производный литье внутри overriden match()
, но это не очень хороший дизайн. Также возможно использовать шаблоны, но это сделает код более сложным, поэтому сначала хочу знать, есть ли какой-либо шаблон проектирования, который я мог бы использовать для достижения того, что я хочу. Или, может быть, мой подход к этой проблеме совершенно неверен, и есть какое-то простое решение, которое я просто не вижу?
Спасибо!
насчет заимствования некоторых приемов программирования Функциональных и использовать логическое выражение лямбды для представления Характеристики (функция эталонной в основном)? Например, в JS это будет так же просто, как: 'function filterCount (items, filter) { return items.filter (filter) .length; } filterCount ([1, 2, 3], function (num) {return num% 2}); filterCount (['a', 'bb', 'ccc'], function (str) {return str.length> = 3;}); ' – plalx
Могут ли критерии быть жестко закодированы? Или вы хотите иметь возможность обновлять критерии без повторной компиляции, то есть через файлы конфигурации? – denniskb
@plalx К сожалению, я использую типизированный язык, поэтому 'function (num)' и 'function (str)' будет два разных типа. Чтобы использовать их, я должен заставить их наследовать от некоторого общего типа. Они также должны были бы принять некоторый абстрактный тип как параметр, так как вы не можете ничего рассказать о содержимом элемента, созданного 'AbstractItemFactory' в моем примере. На этом этапе мы вернемся к своей первоначальной проблеме: внутри этих функций мне пришлось бы отбросить абстрактный тип обратно к производному, и я хочу избежать этого :) – xba