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

awm*_*oss 8 delphi mediator

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

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

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

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

请问这种方法,使用接口,有什么用处?(似乎很复杂)

我正在使用Delphi 2010

[ 解决方案摘要 ]

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

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

您对三个单元的使用条款如下所示:

ConcreteColleage1使用Mediator
ConcreteMediator使用Mediator,ConcreateColleague1
Mediator(不使用)

没有循环参考!

Mar*_*ema 7

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

请参阅:如何避免循环单位参考?有关如何避免Delphi中的圆形参考的更多信息.


LeG*_*GEC 5

我没有看到循环依赖性出现在哪里.如果您按照此图表实现类,则不会发生此类事情.

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

  • 一个Mediator接口(并让你的ConcreteMediator类实现这个接口)
  • 或者Mediator使用虚方法的基类(并让您的ConcreteMediator类派生自Mediator并覆盖这些方法).