8

对于那些熟悉中介者模式的人...

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

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

这在大多数语言中都不是问题,但我的 Delphi 编译器给了我'F2047 Circular unit reference to ...'

这种使用接口的方法有用吗?(看起来很复杂)

我正在使用德尔福 2010

[解决方案总结]

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

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

三个单元的 Uses 子句如下所示:

ConcreteColleage1 使用中介者
ConcreteMediator 使用中介者,ConcreateColleague1
中介者(两者都不使用)

没有循环引用!

4

3 回答 3

7

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

请参阅:如何避免循环单位引用?有关如何在 Delphi 中避免循环引用的更多信息。

于 2011-01-25T07:22:34.627 回答
5

我看不到循环依赖出现在哪里。如果你按照这个图实现你的类,就不会发生这样的事情。

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

  • 一个Mediator接口(并让你的ConcreteMediator类实现这个接口)
  • Mediator具有虚拟方法的基类,(并让您的ConcreteMediator类派生Mediator并覆盖这些方法)。
于 2011-01-25T08:40:44.513 回答
2

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

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

很难知道你的代码会在哪里进行权衡,所以我不想说一种方法比另一种方法更好作为一般规则。

于 2011-01-25T07:39:06.930 回答