Как объединить пулгинов для одного и того же ресурса?
Я работаю в логической архитектуре проекта, который получает некоторую информацию от пользователей и обрабатывает ее. Одним из требований является предоставление интерфейса для внешних разработчиков для добавления дополнительных функций. До сих пор я предлагал 2-уровневую архитектуру MVC, в которой View и Controller выполняются на компьютере пользователя, а модель размещается на сервере приложений и вызывается удаленно. Требование функциональности предлагает мне использовать шаблон плагинов.
Дополнительные шаги, выбранные пользователем, могут быть выполнены при обработке информации, поэтому я хотел смоделировать их как плагины, которые уже будут существовать, когда приложение будет выпущено. Это означает, что эти плагины будут влиять на один и тот же ресурс (поток обработки), и я не уверен, как с этим справиться, когда оба плагина включены.
Поскольку я не так хорошо знаком с шаблоном плагина, как с другими шаблонами, чтение, которое я делал перед тем, как спросить, заставило меня попробовать что-то похожее на шаблон Abstract Factory. Проблема в том, что, когда два или более плагинов включены, мне нужно многократное наследование. Я также подумал о паттерне Builder для отдельного моделирования этапов обработки, но тогда необходимо будет определить порядок между плагинами, что повлияет на независимость разработчиков плагина.
1 ответ
Если я правильно понимаю, вы хотите иметь возможность расширять одну и ту же точку вариации несколькими независимыми плагинами. Если это так, то шаблон труб и фильтров является подходящим механизмом.
При таком подходе плагины представляют собой фильтры, и вы можете создать контейнер плагинов, который загружает, а затем связывает их. Если плагин не загружен для данной точки вариации, то вы либо закорачиваете точку вариации, либо предоставляете какую-либо форму фильтра по умолчанию.
Кроме того, предоставление плагинов механизма для определения их положения в цепочке фильтров будет полезно, поэтому подумайте об этом при разработке интерфейса плагина.