【发布时间】:2010-03-01 14:09:35
【问题描述】:
使用 Delphi 2009 Enterprise,我在模型视图中为 GoF 访问者模式创建了代码,并将代码分成两个单元:一个用于域模型类,一个用于访问者(因为我可能需要其他单元来实现不同的访问者,一切都在一个单元中?'Big ball of mud'前面!)。
unit VisitorUnit;
interface
uses
ConcreteElementUnit;
type
IVisitor = interface;
IElement = interface
procedure Accept(AVisitor :IVisitor);
end;
IVisitor = interface
procedure VisitTConcreteElement(AElement :TConcreteElement);
end;
TConcreteVisitor = class(TInterfacedObject, IVisitor)
public
procedure VisitTConcreteElement(AElement :TConcreteElement);
end;
implementation
procedure TConcreteVisitor.VisitTConcreteElement(AElement :TConcreteElement);
begin
{ provide implementation here }
end;
end.
以及业务模型类的第二个单元
unit ConcreteElementUnit;
interface
uses
VisitorUnit;
type
TConcreteElement = class(TInterfacedObject, IElement)
public
procedure Accept(AVisitor :IVisitor); virtual;
end;
Class1 = class(TConcreteElement)
public
procedure Accept(AVisitor :IVisitor);
end;
implementation
{ Class1 }
procedure Class1.Accept(AVisitor: IVisitor);
begin
AVisitor.VisitTConcreteElement(Self);
end;
end.
看到问题了吗?循环单位参考。有没有优雅的解决方案?我猜它需要“n+1”个带有基接口/基类定义的附加单元来避免 CR 问题,以及硬转换之类的技巧?
【问题讨论】:
-
我仍在等待“循环引用是糟糕设计的标志”这样的评论:)
标签: delphi oop delphi-2009 visitor-pattern