2014-01-31 3 views
0

Я пытаюсь закодировать некоторые фильтры для текстового процессора. Я получаю из файлов сокетов, которые я должен обрабатывать по строкам. Для каждой строки мне нужно применить некоторые фильтры и в определенном порядке. Например, для одного файла я буду использовать фильтр 1, фильтр 2, фильтр 3 и после этого фильтр 2 снова.Определить порядок фильтров

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

+2

декоратор узор? –

ответ

1

Я бы использовал, вероятно, цепочку ответственности.
Я предполагаю, что фильтр говорит либо true (включить/принять строку),
или false (не включайте, то есть отклоните эту строку).

Так цепь несколько фильтров в цепи, если фильтр 1 возвращает true,
затем передать строку на следующий фильтр 2 (и так далее). В противном случае
(если какой-либо фильтр из цепочки говорит false), отклоните линию и
не переходите к проверке со следующим фильтром из цепочки.

chain of responsibility pattern

Что является лучшим способом, чтобы обеспечить высокую скорость
выполняющихся это фильтры построчно?

Это зависит от слишком большого количества факторов, поэтому
трудно дать ответ на него.

+0

Цепь ответственности была моей первой идеей, но пока все фильтры должны быть выполнены, я не знаю, подходит ли это лучший подход. Мой вопрос был недостаточно ясным. Фильтры не принимают или не отклоняют строки.Возможно, подходящее слово будет Normalizer, потому что они работают над линией, заменяющей слова, символы, исправляя грамматику и т. Д. Скорость этой цепочки должна быть высокой, потому что мне придется обрабатывать тысячи строк в реальном времени, поэтому я не хочу потерять время в медленной петле итерации. Это не соответствует вашему предложенному шаблону. –

+0

Ну, если главной проблемой является скорость, я предпочел бы взглянуть на некоторые хорошие алгоритмы (основанные на операциях, которые я хочу выполнять на линиях), а не на шаблонах проектирования. Только один раз, когда я решаю алгоритм, я буду искать конкретный шаблон дизайна. –

+0

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

1

Это очень похоже на сервлет-фильтры, за исключением того, что вы хотите иметь возможность применять один и тот же фильтр несколько раз.

Как и другие, предположил, что Цепь ответственности может быть уместна, особенно если фильтр должен иметь возможность прервать дальнейшее выполнение других фильтров и нуждается в управлении «вокруг», то есть он хочет выполнить некоторую обработку до остальной части цепочка делает это и выполняет некоторую другую обработку после.

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

Я думаю о unix-трубах. Каждый Filter делает свое дело, не зная, откуда приходит его вход, и кто потребляет его выход.

Компонент Controller создает цепочки по мере необходимости, я не знаю, применима ли одна целая цепочка ко всем файлам или существует фиксированный набор цепей, один из которых выбран каким-либо образом для каждого файла, или новый цепочка создается для каждого файла.

FilterChain применяет фильтры. Если вы следуете шаблону Chain of Responsibility, ему нужно только вызвать первый (верхний) фильтр, иначе он должен будет проходить через все фильтры в цепочке.

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