亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

設計模式、用Delphi描述-->Visitor模式

2019-11-18 18:45:32
字體:
來源:轉載
供稿:網友

Visitor 模式

起源

Delphi中的Visitor模式在基本Visitor模式進行了擴展。更多Visitor模式的資料請參 [Gam+, pages 331..344].

目的

表示一個作用于某個對象結構的中和元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。

 [Gam+, page 331].

動機

考慮一個面向對象的建模工具比如說Rational Rose、ModelMaker,它將一個模型表示為類和類的成員。

在建模工具上提供了許多操作成員功能,比如:列表類的所有成員、生成類的代碼框架、反向工程等。

這些操作大多對不同的成員進行不同的操作。它將成員分成字段(fields)、方法(methods)、

屬性(PRoperties)。因些我們必須建立專門處理字段的類,專門處理methods的類等等。成員類的集合當然依賴被編譯的語言。但對于一給定語言變化不大。

 

 

 

如圖顯示了部分成員類的框架。問題產生了,如果我將所有這些操作分散到不同的成員類,

將會導致整個系統難于理解,修改,維護。將類代碼生成與類成員檢查放在一起,將產生混亂。些外加入新的操作時要重新編譯的有的類(至少也重新編譯所有的相關的系)。有個辦法:你可能獨立的增加一個新的操作,并這個成員類獨立如作用于其上的操作。

要實現上述兩個目標,我們可以將每個類中相關操作包裝在一上獨立的對象(稱為visitor

并在遍歷類成員列表時將此對象傳遞給當前成員。當一個成員‘接受’ 訪問,該成員向訪問者發送包含自身信息的請求。該成員請自本身作為一個參數。訪問者執行這些操作。

例如:一個不使用訪問者的代碼生成器可能會通成員類的抽象的方法:TMember.WriteInterfaceCode(Output: TStream)生成代碼。每一個成員都會調用WriteInterfaceCode生成適當的輸出代碼。如果通過訪問者來生成代碼,則會創建一個TinterfaceCodeVisitor對象,并在成員列表上調用參數為訪問對象的AcceptVisitor方法。每一個在員在實現AcceptVisitor將會回調visitor一個字段將調用訪問者的VisitField方法,而一個方法則調用VisitMethod方法。這樣,以前類TfieldWriteInterfaceCode操作現在成為TinterfaceCodeVisitorVisitField操作。

 

為使訪問者不僅僅只做代碼生成,我們需要所有的成員列表的訪問者有一個抽象的父類TmemberVisitor。TmemberVisitor必須為每一個成員定義一種方法。一個需要將成員輸出為HTML格式的應用將定義TmemberVisitor新的子類,并不再需要在成員類中增加與特定應用相關的代碼。Visitor模式將每個操作封裝在一個相關的Visitor

 


 

 

 

使用Visitor模式,必須定義兩個層次的類:一個應于接受操作的元素(Tmember層次)另一個定義于對元素的操作(TmemberVisitor 層次)。增加一個新的操作時只需給訪問者層次增加一個新的子類。我可能簡單的定義新的TmemberVisitor子類以增加新的功能。

 

應用

下面的代碼演示上面描述的類TmemberVisitor模式的應用

 

type

  TMember = class (TObject)

  public

    procedure AcceptMemberVisitor(Visitor: TMemberVisitor); virtual;

  end;

 

  TField = class (TMember)

  public

    procedure AcceptMemberVisitor(Visitor: TMemberVisitor); override;

  end;

 

  TMethod = class (TMember)

  public

    procedure AcceptMemberVisitor(Visitor: TMemberVisitor); override;

  end;

 

  TProperty = class (TMember)

  public

    procedure AcceptMemberVisitor(Visitor: TMemberVisitor); override;

  end;

 

  TMemberVisitor = class (TObject)

  public

    procedure VisitField(Instance: TField); virtual;

    procedure VisitMember(Instance: TMember); virtual;

    procedure VisitMethod(Instance: TMethod); virtual;

    procedure VisitProperty(Instance: TProperty); virtual;

  end;

 

implementation

 

{ TMember }

 

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

    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實例

正在組織

//很多摘自《設計模式》,


上一篇:Delphi報表控件----SReport3強大易用穩定與最終用戶交互良好(新)

下一篇:Delphi命令行參數

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品极品在线| 欧美精品国产精品日韩精品| 欧美久久精品一级黑人c片| 国产精品丝袜一区二区三区| 国内揄拍国内精品少妇国语| 中文字幕亚洲一区二区三区| 庆余年2免费日韩剧观看大牛| 91精品久久久久久久久不口人| 欧美日韩国产在线播放| 性欧美视频videos6一9| 欧美在线观看网站| 精品国产电影一区| 日韩国产高清污视频在线观看| 久久视频这里只有精品| 国产精品看片资源| 亚洲自拍偷拍网址| 亚洲欧美成人精品| 中文字幕av一区| 欧美日韩亚洲天堂| 久久久久久av| 亚洲第一中文字幕| 成人国内精品久久久久一区| 97涩涩爰在线观看亚洲| 91嫩草在线视频| 国产69精品久久久| 国产精品久久久久久久久久免费| 性色av一区二区三区免费| 美女性感视频久久久| 欧美另类第一页| 成人黄色av网| 91黑丝高跟在线| 国产精品久久久久久久9999| 日韩av电影手机在线观看| 午夜精品久久17c| 91免费版网站入口| 久久精品国产99国产精品澳门| 欧美激情高清视频| 欧美激情精品久久久久久免费印度| 91免费视频网站| 中文字幕亚洲第一| 欧美亚洲国产日韩2020| 国产精品1区2区在线观看| 亚洲精品videossex少妇| 亚洲欧美三级在线| 久久天天躁狠狠躁夜夜躁| 国产精品看片资源| 久久久av网站| 国产精品极品尤物在线观看| 日本高清不卡的在线| xxxx欧美18另类的高清| 国产一区二区精品丝袜| 欧美一区二区三区免费视| 亚洲人午夜色婷婷| 91最新国产视频| 亚洲综合中文字幕在线观看| 在线视频亚洲欧美| 亚洲精品成人网| 亚洲国产精品yw在线观看| 精品久久久久久久中文字幕| 亚洲欧美日韩视频一区| 91天堂在线观看| 国产一区二区三区高清在线观看| 日韩av影视综合网| 97久久超碰福利国产精品…| 日韩成人在线电影网| 欧美一区三区三区高中清蜜桃| 日韩欧美国产一区二区| 久久99精品久久久久久青青91| 在线亚洲欧美视频| 日韩电影免费观看中文字幕| 在线播放国产一区二区三区| 亚洲欧美国产视频| 96国产粉嫩美女| 亚洲伊人成综合成人网| 亚洲一区二区三区在线免费观看| 国产成人精品国内自产拍免费看| 在线成人激情黄色| 亚洲三级免费看| 欧美一级免费看| 91av在线播放| 国产精品成熟老女人| 日韩福利视频在线观看| 136fldh精品导航福利| 国产精品久久国产精品99gif| 久久亚洲精品成人| 日本精品久久久久影院| 97视频在线观看视频免费视频| 国产精品爱久久久久久久| 亚洲精品一区二区三区不| 亚洲aⅴ日韩av电影在线观看| 日韩av在线播放资源| 亚洲精品自产拍| 在线视频日本亚洲性| 亚洲免费电影在线观看| 亚洲国产成人精品电影| 大胆人体色综合| 国产日韩欧美电影在线观看| 久久精品视频在线观看| 国模精品视频一区二区| 亚洲精品www久久久久久广东| 亚洲欧美激情视频| 97国产suv精品一区二区62| 亚洲香蕉成人av网站在线观看| 国产精品扒开腿做爽爽爽男男| 久久久久久国产精品美女| 黑人巨大精品欧美一区二区三区| 国产精品www网站| 国产精品欧美日韩| 亚洲中国色老太| 色中色综合影院手机版在线观看| 亚洲欧美综合图区| 欧美激情一级精品国产| 久久久久久有精品国产| 96精品久久久久中文字幕| 色偷偷偷亚洲综合网另类| 国产精品香蕉在线观看| 中文字幕免费精品一区高清| 亚洲成人aaa| 成人欧美一区二区三区黑人| 91po在线观看91精品国产性色| 国外成人性视频| 日韩av日韩在线观看| 777国产偷窥盗摄精品视频| 精品成人久久av| 欧美激情精品久久久| 黄色精品一区二区| 国产日韩在线观看av| 成人黄色免费片| 久久人人爽人人爽人人片av高请| 日本高清视频一区| 久久综合久久88| 久久综合久久美利坚合众国| 日韩欧美在线视频日韩欧美在线视频| 欧美日韩成人免费| 日韩暖暖在线视频| 国产精品99久久久久久久久久久久| 91影院在线免费观看视频| 亚洲国产婷婷香蕉久久久久久| 国产日韩在线精品av| 国产欧美日韩亚洲精品| 日本免费一区二区三区视频观看| 91国在线精品国内播放| 欧美成人午夜激情| 国产精品久久久久久久久久99| 26uuu国产精品视频| 国产精品视频网址| 欧美日韩中文字幕| 丝袜情趣国产精品| 亚洲美女免费精品视频在线观看| 亚洲国产精品小视频| 国产精品日日做人人爱| 欧美日韩视频免费播放| 国产精品热视频| 国产有码在线一区二区视频| 成人av资源在线播放| 亚洲国产精品专区久久| 国产一区二区三区在线看| 亚洲视频国产视频| 欧美亚洲成人免费| 欧美俄罗斯乱妇| 欧美电影在线观看完整版| 91理论片午午论夜理片久久| 亚洲国产精品国自产拍av秋霞| 国产一区私人高清影院|