2011-12-19 78 views
0

我正在制作一个软件,旨在创建一个像文档一样的书。我已经实现了它使用装饰添加各种功能。这里是初始化”的一个例子如何为可配置软件设置Builder和Decorator模式?

$this->chapter[i] = new ChapDecorator1(new ChapDecorator2(new Chapter(i))); 

所面临的挑战是,这些装饰是硬编码,并且没有为sofware的多次迭代的潜力。对新项目所做的有意义的更改通常会回溯到较旧的项目(现在使用装饰器并不可怕,因为所需要的只是将另一个装饰器添加到定义中)。但是,这仍然需要我编辑子类代码。最佳情况是实际内容创建者选择他们需要的功能,而不需要程序员编辑任何内容。

显然,更好的东西在这种情况下,做的是书到用一个对象,实现Builder模式来创建对象的章并在项目的正确装饰包裹。

最后,我们到达了我的问题是如何才能让建设者对象动态和正确处理的配置顺序?装饰器包装的顺序意味着解析接口调用的命令(LIFO)。一个例子是文档编辑跟踪是作为装饰器实现的,但由于显而易见的原因,应该总是首先评估以在更改之前保存状态(它应该是最后一个包装器)。对于将来的开发,假设将会有许多装饰器,那么一些可能需要首先解决的装饰器应该是每个装饰器具有类似于Builder可能排序的优先数据成员(整数?)的东西?这似乎是一个可行的解决方案,但我担心如果创建大量优先级敏感的装饰器/模块,则实现不会非常健壮。例如,相互冲突的优先级可能需要重新编号许多类。无论如何,我希望人们对此事有任何想法。

的第二个问题是,如果两个修饰改变相同的特征以某种方式。如果这种情况甚至是可能的?每个装饰者是否应指定其域并遍历寻找冲突的装饰者列表?

这一切都是假设会有很多装饰和一些项目的编辑将选择一些而不是其他。 谢谢!

回答

0

您可以使用修改后的建设者为此,在您为构建器方法的每次调用返回不同的器类,并返回生成器类仅有的所有方法的一个子集来构建整个类。

这可以让你避免多次调用同样的方法,并且还允许您控制整体构建顺序。 可以在这里找到一个example of this

+0

谢谢,我认为这是一个开始,但对于我的情况还不太完美。有两个问题冗余和秩序。对于建筑商,我主要关注订单。我可以回答关于哪个装饰器首先解决的问题。最后一个应用然后向内工作。这给了我一个订单,但是如何让构建者按照基于数据库设置的顺序来应用它们,而无需诉诸静态优先级整数。 冗余是关于装饰者。当接口调用时,应该允许两个修饰器编辑相同的功能? – Hath995 2011-12-20 18:24:50

+0

对不起,我想我没有说清楚。我会重申这个问题。 – Hath995 2011-12-20 18:37:32