图限制 - 我应该使用Decorator吗?

时间:2010-03-24 22:33:52

标签: dependency-injection graph decorator single-responsibility-principle

我有一个功能性的AdjacencyListGraph类,它遵循定义的接口GraphStructure。为了对此进行分层限制(例如,非循环,非空,唯一顶点数据等),我可以看到两条可能的路径,每条路径都使用GraphStructure接口:

  1. 创建一个类(“ControlledGraph”),它具有一组指定各种可能限制的位标志。处理本课程的所有限制。如果新的限制要求变得明显,请更新课程。

  2. 使用装饰器模式(本质上是DI)为客户端类可能希望使用的每个限制创建单独的类实现。这样做的好处是我们坚持单一责任原则。

  3. 我会倾向于后者,但是通过Jove!,我讨厌装饰者模式。它是杂乱的缩影,IMO。说实话,这一切都取决于在最坏的情况下可能应用多少装饰器 - 到目前为止,我的计数是七(我在此阶段已经认识到的离散限制的数量)。装饰器的另一个问题是我将不得不在每个...单...装饰器类中进行接口方法包装。呸。

    如果有的话,你会去哪?或者,如果你能提出一些更优雅的解决方案,那将是受欢迎的。

    编辑:在我看来,使用提议的ControlledGraph类和策略模式可能会有所帮助...某种模板方法/仿函数设置,各个位在各种图形规范界面方法中应用单独的控件。还是我失去了情节?

1 个答案:

答案 0 :(得分:0)

啊,我现在看到了。 ControlledGraph类中的策略模式确实是可行的方法。

每个限制都是一个离散的策略类。这些中的每一个都实现了整个GraphStructure接口,尽管大多数方法都是空的(例如,非循环限制只对使用addEdge()以防止循环插入感兴趣,而其他方法将留空)。

每次ControlledGraph调用其中一个接口方法时,它都会调用它包含的每个策略/限制的匹配方法。显然,它可能只包含每种策略中的一种。