Я работаю над программным обеспечением, предназначенным для создания книгоподобных документов.Я реализовал это, используя декораторы для добавления различных функций.Вот пример инициализации '
$this->chapter[i] = new ChapDecorator1(new ChapDecorator2(new Chapter(i)));
Проблема в том, что эти декораторы жестко запрограммированы и что существует потенциал для многих итераций программного обеспечения.Интересные изменения, внесенные в новые проекты, часто переносятся в старые (что сейчас не так уж и страшно с декораторами, поскольку все, что требуется, - это добавить еще один декоратор в определение).Однако, это все еще требует, чтобы я отредактировал код подкласса.Оптимальной является ситуация, когда сами создатели контента выбирают, какие функции им нужны, без необходимости что-либо редактировать.
Очевидно, что в этом случае лучше всего использовать для Book объект, реализующий шаблон Builder, для создания объекта Chapter и оборачивать его в правильные декораторы для проекта.
Наконец, мы подходим к моему вопросу: как я могу заставить объект-строитель динамически и правильно обрабатывать порядок конфигурации?Порядок, в котором оформляются декораторы, подразумевает порядок разрешения вызовов интерфейса (LIFO).Примером является то, что отслеживание редактирования документа реализовано как декоратор, но по очевидным причинам всегда следует сначала оценивать, чтобы сохранить состояние до внесения изменений (это должна быть последняя обертка).Для будущей разработки, предполагающей, что будет много декораторов, некоторые из них, возможно, потребуется решить в первую очередь, если у каждого декоратора есть что-то вроде приоритетного элемента данных (целое число?), По которому может сортировать Builder?Это выглядит как работоспособное решение, но я обеспокоен тем, что реализация не будет очень надежной, если будет создано большое количество чувствительных к приоритету декораторов / модулей.Например, конфликтующие приоритеты могут потребовать перенумерации многих классов.Во всяком случае, я был бы признателен за любые мысли по этому поводу.
Второй вопрос - если два декоратора каким-то образом меняют одну и ту же функцию.Должна ли такая ситуация вообще быть возможной?Должен ли каждый декоратор указывать свой домен и обходить список декораторов, ищущих конфликты?
Все это при условии, что будет много декораторов, и что некоторые редакторы проекта выберут некоторые, но не другие.Спасибо!