打印本文 打印本文 关闭窗口 关闭窗口
设计模式、用Delphi描述--Visitor模式
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2005  更新时间:2009/4/23 18:40:55  文章录入:mintao  责任编辑:mintao
    FOutput: TTextStream;

  public

    procedure VisitField(Instance: TField); override;

    procedure VisitMethod(Instance: TMethod); override;

    procedure VisitProperty(Instance: TProperty); override;

    property Output: TTextStream read FOutput write FOutput;

  end;

 

 

{ TCodeGenerationVisitor }

procedure TCodeGenerationVisitor.VisitField(Instance: TField);

begin

  Output.WriteLnFmt(''''  %s: %s;'''', [Instance.Name, Instance.DataName]);

end;

 

procedure TCodeGenerationVisitor.VisitMethod(Instance: TMethod);

var

  MKStr, DTStr: string;

begin

  case Instance.MethodKind of

    mkConstructor: MKStr := ''''constructor'''';

    mkDestructor: MKStr := ''''destructor'''';

    mkProcedure: MKStr := ''''procedure'''';

    mkFuntion: MKStr := ''''function'''';

  end;

  if Instance.MethodKind = mkFunction then

    DTStr := '''': '''' + Instance.DataName

  else

    DTStr := '''''''';

  {代码不完整,现足以演示Tmethod代码生成 }

  Output.WriteLnFmt(''''  %s %s%s%s;''''

                    [MKStr, Instance.Name, Instance.Parameters, DTStr]);

end;

 

procedure TCodeGenerationVisitor.VisitProperty(Instance: TProperty);

begin

  Output.WriteLnFmt(''''  property %s: %s read %s write %s;'''',

                    [Instance.Name, Instance.DataName,

                     Instance.ReadSpecifier, Instance.WriteSpecifier]);

end;

 

{ TCodeGenerator }

procedure TCodeGenerator.Generate(Members: TList; Output: TTextStream);

var

  I: Integer;

begin

  {写入类定义 }

  Output.WriteLine(''''TSample = class (TObject)'''');

 

 

  {好! 加入代码生成器的访问者}

  Visitor := TCodeGenerationVisitor.Create;

  Try

    {记住为访问都提供上下文,以便更好的访问VisitXXX方法。}

    for I := 0 to Members.Count - 1 do

      { 代码的具体段,好事情发生了}

      TMember(Members[I]).AcceptMemberVisitor(Visitor);

  finally

    Visitor.Free;

  end;

  {类成员的代码生成完毕}

  Output.WriteLine(''''end;'''');

end;

 

Delphi实例

正在组织

//很多摘自《设计模式》,

上一页  [1] [2] [3] 

打印本文 打印本文 关闭窗口 关闭窗口