2012-01-25 6 views
0

Я пишу спецификацию, в которой я хочу указать (недвусмысленным образом), что программист использует этот шаблон:Как называется этот шаблон?

Мы должны применить несколько фильтров к данным, которые мы обрабатываем. Конфигурация позволяет создавать эти фильтры. Их может быть несколько, или нет. Я не хочу эту логику в классе экспорта (потому что в будущем она может стать большой, с различными фильтрами, которые мы не можем предвидеть сейчас). Я хочу, чтобы они запускались один за другим, поэтому я хочу попросить метод в классе экспорта: «addFilter», который должен хранить объекты во внутреннем массиве и затем выполнять их при выполнении фактического процесса экспорта ,

Я не знаю, достаточно ли ясен. Это похоже на целенаправленную стратегию, но не совсем стратегию, потому что не обязательно иметь фильтр.

Опять же, возникает вопрос: как я могу назвать этот шаблон в спецификациях?


Edit: пример того, что я пытаюсь сделать:

$report = new Report(); 
$report->addFilter(new RemoveSpaces()) 
     ->addFilter(new SubstituteText($predefined_substitutions_array) 
     ->addFilter(new FixCapitals()) 
     ->addFilter(new Encode("utf8")); 
echo($report->generate()); // filters are actually used during generation. 

Предполагается, что пользователь должен иметь возможность решить, следует ли RemoveSpaces или нет, какой текст заменить, нужно ли капитализировать слова или нет, какую кодировку использовать и т. д. Некоторые фильтры, безусловно, будут добавлены в будущем на запрос пользователя (клиента, на самом деле).

После факторизуются, фильтры должны иметь простой интерфейс, что доклад будет назвать:

foreach($this->filters as $current_filter) { 
    $data = $this->filters[$current_filter]->applyTo($data); 
} 
+0

Не могли бы вы добавить пример псевдокода, чтобы проиллюстрировать, о чем вы говорите? –

+0

См. Отредактированный вопрос. –

ответ

1

Я бы сказал, что вы не указали достаточно кода, чтобы определить, какой шаблон можно использовать для достижения вашей цели, потому что вы не показывали какой-либо образец кода или подписи вашего класса Filter.

Как ваш класс Report взаимодействует с классом Filter (или наоборот)?

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

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

FilterA fA = new FilterA(coreObject); 
FilterB fB = new FilterB(fA); 
FilterC fC = new FilterC(fB); 

Конечно, это не должно быть сделано с помощью конструктора так, как я сказал, мы должны были бы увидеть больше кода, чтобы знать, если это было декоратор.

Я склонен думать, что вы идете по шаблону «Трубы и фильтры», где вывод каждой операции является входом следующего, но даже это не ясно, не зная большего. Я не могу сказать, действует ли каждый фильтр на одно и то же (например, гигантский String) или каждый из них должен взаимодействовать с каким-то аспектом объектной модели Report.

Например, если отчет имеет свойство объекта, которое является текущим Encoder, то, возможно, ваш фильтр Encode("utf8") просто действует как fcatory, который настраивает/устанавливает подкласс Encoder для решения стратегии устойчивости диска. Тем временем ваш SubstituteText($predefined_substitutions_array) действует на коллекцию Parameters, принадлежащую отчету, для обмена значениями времени выполнения.

Я бы предложил описать, чего вы хотите достичь, а не столько, как достичь этого.

+0

«Трубы и фильтры» это! –

1

Выглядит в основном как Chain of responsibility. Обратите внимание, что каждый фильтр может решить не продолжать цепочку. И обычно есть «цепной» объект, который передается каждому последующему фильтру.

Если вам не нужна эта семантика цепи, ее можно рассматривать просто как proxies вокруг целевого объекта.

+0

Хмм ... не прокси-сервер, поскольку я не пытаюсь получить доступ к чему-либо, но применять простые преобразования и/или фильтры к данным, которые я собираюсь экспортировать. Как я уже сказал @havexz, я не стал бы называть его «Цепью ответственности», ради того, чтобы держать его простым для программистов. Думаю, я просто опишу шаблон. Благодаря! –

2

Я думаю, что вам не обязательно выбирать один образец, как в большинстве проблем реального мира. Один шаблон обычно не охватывает всю реализацию. Таким образом, в вашей спецификации вы можете указать все шаблоны, на которые вы вдохновляете. И вы можете документировать, что отличается от вашей реализации от оригинальных шаблонов.

В вашем конкретном случае, он похож на Chain of Responsibility

Вы также можете посмотреть Decorator шаблон, как то будет также предназначены для реализации фильтра, как черт.

BTW другой образец, аналогичный вашему, является Command Pattern. Итак, в вашем случае generate из Report похож на execute из Command, а фильтры - это команды в Списке.

+0

+1 :) В любом случае, я уверен, что это не шаблон Decorator, поскольку он не будет добавлять методы или изменять интерфейс/функциональность моих объектов данных. Цепочка ответственности тоже была моей догадкой, но мне это не нравится для спецификации, поскольку я не хочу вводить в заблуждение программистов, чтобы думать, что я прошу что-то более сложное, чем простой фильтр/преобразование данных. –

+0

Что я хочу сказать, что то, что вы пытаетесь реализовать (например, фильтры), также можно реализовать с помощью Decorator. Декоратору не нужно добавлять методы, необходимые, чтобы иметь один и тот же интерфейс. Примеры, такие как BufferedInputStream, FileInputStream и т. Д. ('BufferedInputStream bin = new BufferedInputStream (новый FileInputStream (имя файла));') – havexz

+0

Вы правы, но Decorator кажется слишком сложным для ocasion. Мне нужны только объекты-оболочки для функции преобразования, и ее нужно настраивать независимо от того, применять их или нет. См. Мой отредактированный вопрос. Я знаю, что это шаблон, который я хочу, а не декоратор. Я хотел бы знать, что это имя. –

Смежные вопросы