|
begin
Visitor.VisitMember(Self);
end;
{ TField }
procedure TField.AcceptMemberVisitor(Visitor: TMemberVisitor);
begin
end;
{ TMethod }
procedure TMethod.AcceptMemberVisitor(Visitor: TMemberVisitor);
begin
Visitor.VisitMethod(Self);
end;
{ TProperty }
procedure TProperty.AcceptMemberVisitor(Visitor: TMemberVisitor);
begin
Visitor.VisitProperty(Self);
end;
{ TMemberVisitor }
procedure TMemberVisitor.VisitField(Instance: TField);
begin
end;
procedure TMemberVisitor.VisitMember(Instance: TMember);
begin
end;
procedure TMemberVisitor.VisitMethod(Instance: TMethod);
begin
end;
procedure TMemberVisitor.VisitProperty(Instance: TProperty);
begin
end;
说明:
· TMember, TField, TMethod 和 Tproperty都实现了AcceptMemberVisitor方法. 这些方法都嵌入模式中
· TMemberVisitor 类实现了VisitMember, VisitField等方法。TmemberVisitor是一个抽象的类,它所有的方法由具体的子类实现。
下面是一个简单的代码生成器的实现。
代码介绍:
· TCodeGenerationVisitor 是一个用于实现成员的代码生成器的访问者。
· 访问者定义了一个上下文相关的属性:Output: TTextStream,
· 它必须在VisitXXX调用前被定,如:DrawingVisitor典型的需要一个包括canvas的上下文,来支持画图操作。上下文在遍历整个member对列前赋予了代码生成器。
· 代码生成器将整结的生成的类的所有代码
要真正的了解Visitor模式,你可执行这个例子 ,并进一步的学习双分派机制: accept/visit.
unit CodeGenerators;
interface
uses Classes, TextStreams;
type
TCodeGenerator = class (TObject)
public
procedure Generate(Members: TList; Output: TTextStream);
end;
implementation
uses Members;
type
TCodeGenerationVisitor = class (TMemberVisitor)
private
上一页 [1] [2] [3] 下一页 |