在Delphi中实现Mediator模式而不获取循环引用

时间:2011-01-25 05:45:47

标签: delphi mediator

对于那些熟悉Mediator模式的人......

我想在Delphi中实现Mediator模式,但是Delphi编译器无法处理所需的循环引用。

查看“设计模式”中的原始GOF图,Mediator具有对每个同事的引用,但许多同事对象都有对Mediator的引用。

这在大多数语言中都不是问题,但是我的Delphi编译器给了'F2047循环单元引用...'

使用接口this approach会有用吗? (似乎很复杂)

我正在使用Delphi 2010

[解决方案摘要]

总结一下接受的答案:在允许循环引用的语言中,您可以省略抽象Mediator类(如第278页的GoF“实现”部分所述)。 在没有抽象Mediator类的情况下,在Delphi中实现Mediator的唯一方法是将所有类放在一个Unit 中。

否则,除了具体的子类之外,还需要一个额外的抽象Mediator基类。

这三个单位的用途条款如下所示:

ConcreteColleage1使用Mediator
ConcreteMediator使用Mediator,ConcreateColleague1
调解员(不使用)

没有循环引用!

3 个答案:

答案 0 :(得分:7)

使用接口肯定有助于减少单元之间的依赖关系。另一种方法是使用抽象基类来定义类之间的交互方法,然后将具体的后代放在不同的单元中。

有关如何避免在Delphi中进行环形参考的更多信息,请参阅:How to avoid circular unit reference?

答案 1 :(得分:5)

我没有看到循环依赖性出现在哪里。如果您在this diagram之后实施课程,则不会发生此类事情。

要在Delphi中实现此图,您确实需要编写

  • Mediator接口(并让您的ConcreteMediator类实现此接口)
  • 或具有虚拟方法的基础Mediator类,(并使ConcreteMediator类派生自Mediator并覆盖这些方法)。

答案 2 :(得分:2)

另一个需要考虑的选择是将Mediator和同事放在同一个单元中。在许多情况下,这是习惯性的Delphi方法,以避免循环引用。

使用interfaces通常是解决此类问题的好方法,但有时会导致额外的复杂性而无法获得真正的收益。

很难知道你的代码会在哪些方面进行权衡,所以我不想说一种方法比一般方法更好。