Судя по твоему описанию, это что-то другое. И цепочка ответственности, и конвейер имеют дело с последовательной обработкой. По крайней мере, если я правильно понимаю ваше описание, у вас есть в основном ряд «элементов процессора», работающих с данными параллельно.
Обычно вы бы справились с такой ситуацией с набором наблюдателей, но ваше описание также не соответствует шаблону наблюдателя. В частности, кажется, что каждый из ваших процессорных элементов знает (по крайней мере) об одном другом процессорном элементе. С шаблоном наблюдателя наблюдатели обычно не обращают внимания друг на друга - каждый регистрируется в источнике данных, и когда появляются новые/измененные данные, все наблюдатели уведомляются источником данных.
Моей немедленной реакцией было бы то, что вам, вероятно, лучше использовать шаблон наблюдателя, а не искать имя для того, что вы сделали. Одним из пунктов паттернов является решение схожих задач сходными способами. Судя по всему, это, вероятно, было бы немного более универсальным и управляемым. Например, если вы решите исключить одного наблюдателя из цепочки, вам, очевидно, придется изменить для этого другого наблюдателя. С обычным шаблоном наблюдателя вы можете добавлять или удалять наблюдателей, не изменяя других (и так, чтобы другие даже не знали, что что-то вообще изменилось).
Редактировать: Учитывая смесь независимых и цепных элементов, я вижу два возможных варианта. Первый (и, вероятно, самый чистый) — использовать шаблон наблюдателя на верхнем уровне, а некоторые из наблюдателей сами будут конвейерами.
Другой возможностью было бы украсть трюк у процессоров VLIW и на верхнем уровне иметь флаг, указывающий, зависит ли конкретный элемент от результата предыдущего или нет. Это позволяет довольно легко смешивать конвейеры с независимыми наблюдателями, и если (например) какое-то время вы заботитесь о параллельной обработке, довольно легко выполнять независимые процессы параллельно, сохраняя при этом последовательное выполнение для тех, кто в этом нуждается.
person
Jerry Coffin
schedule
05.01.2010