Design patterns 如何设置可配置软件的构建器和装饰器模式?

Design patterns 如何设置可配置软件的构建器和装饰器模式?,design-patterns,plugins,decorator,builder,configurable,Design Patterns,Plugins,Decorator,Builder,Configurable,我正在开发一个软件,用来创建一个像书一样的文档。我已经使用decorator来实现它,添加了各种特性。下面是初始化操作的一个示例 $this->chapter[i] = new ChapDecorator1(new ChapDecorator2(new Chapter(i))); 挑战在于,这些装饰器是硬编码的,并且有可能进行多次软件迭代。在新项目上所做的有趣的更改通常会被后传到旧项目(这对于decorator来说并不可怕,因为所需要的只是在定义中添加另一个decorator)。但是,这

我正在开发一个软件,用来创建一个像书一样的文档。我已经使用decorator来实现它,添加了各种特性。下面是初始化操作的一个示例

$this->chapter[i] = new ChapDecorator1(new ChapDecorator2(new Chapter(i)));
挑战在于,这些装饰器是硬编码的,并且有可能进行多次软件迭代。在新项目上所做的有趣的更改通常会被后传到旧项目(这对于decorator来说并不可怕,因为所需要的只是在定义中添加另一个decorator)。但是,这仍然需要我编辑子类代码。最佳情况是,实际的内容创作者选择他们需要的功能,而不需要程序员编辑任何内容

显然,在这种情况下,更好的做法是本书使用一个实现Builder模式的对象来创建Chapter对象,并将其包装到项目的正确装饰器中

最后,我们得出了我的问题,那就是如何让builder对象动态正确地处理配置顺序?decorator的包装顺序意味着接口调用的解析顺序(LIFO)。例如,文档编辑跟踪是作为装饰器实现的,但是出于明显的原因,在进行更改之前,应该首先评估保存状态(它应该是最后一个包装器)。对于未来的开发,假设将有许多装饰器,其中一些可能需要首先解决,如果每个装饰器都有一个优先级数据成员(integer?),构建器可能会对其进行排序?这似乎是一个可行的解决方案,但我担心如果创建了大量对优先级敏感的装饰器/模块,那么实现将不会非常健壮。例如,优先级冲突可能需要对许多类重新编号。不管怎样,我很感激人们对这件事的任何想法

第二个问题是,如果两个装饰器以某种方式更改了相同的特性。这种情况可能吗?每个decorator是否应该指定其域并遍历查找冲突的decorator列表

这都是假设将有许多装饰者,并且一些项目编辑器将选择一些装饰者,而不是其他装饰者。
谢谢

您可以使用一个修改过的构建器来实现这一点,在这里,您可以为构建器方法的每次调用返回一个不同的构建器类,并且返回的构建器类只包含用于构建整个类的所有方法的子集

这允许您避免多次调用相同的方法,还允许您控制整个构建顺序。
您可以在这里找到一份工作。

谢谢,我认为这是一个开始,但对于我的情况来说还不太完美。有两个问题:冗余和顺序。对于建筑商来说,我主要关心的是订单。我可以回答我的问题,关于哪个装饰师将首先解决。最后一个应用,然后向内工作。这给了我一个顺序,但是如何让构建器根据数据库设置按顺序应用它们,而不诉诸静态优先级整数呢。冗余是关于装修工的。当对它进行接口调用时,是否应该允许两个装饰器编辑相同的功能?对不起,我想我没有说清楚。我将重新措辞这个问题。