Посмотрев, как Шаблон команды использовался в предыдущем проекте, я могу понять, как он может быть полезен в многопоточном (параллельном) программировании, поскольку команды могут выполняться в разных потоках. Когда данные должны передаваться между командами, данные могут храниться в общей памяти, и указатель (или дескриптор) этих данных может передаваться вызывающему в другом потоке.
Однако шаблон Decorator, по-видимому, имеет ограничение, согласно которому все должно происходить в одном потоке, поскольку декоратор должен вызывать делегат напрямую, подразумевая, что он должен быть в одном потоке.
Правильно ли я понимаю это ограничение? Наоборот, возможно ли запустить декоратор на нескольких потоках?
Я пытаюсь реализовать конвейер, который обрабатывает поток данных.
- Для реализации в виде шаблона Command его метод
execute
будет принимать два аргумента: буфер для ввода и буфер для вывода.
- Для реализации в качестве шаблона Decorator его метод
getdata
будет вызывать свой делегат для получения результата предыдущего шага, применять свою собственную обработку и возвращать результат вызывающей стороне.
Однако после того, как я реализовал его в обоих стилях, я обнаружил, что у каждого есть ограничения, которые мне изначально не были понятны.
- При использовании шаблона Command я могу начать принимать больше входных данных, используя новый буфер, в то время как более ранние буферы обрабатываются некоторыми командами, работающими в отдельных рабочих потоках. Кажется, я не могу сделать это с шаблоном Decorator.
- При использовании шаблона Decorator, декоратор может сделать любое количество вызовов своему делегату и иметь возможность объединить результаты в один фрагмент. Он также может разделять данные, делая один большой запрос, кэшируя его, а затем возвращая его части. Когда я использую шаблон команды с одним входным буфером и одним выходным буфером, не может быть никакой комбинации или разделения результатов.