《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:内部迭代器(使用函数指针)

    技术2026-05-19  7

    示例:内部迭代器(使用函数指针) 说明: 通过给迭代器传递一个函数指针(全局的或静态的)来实现内部迭代器。 代码: unit uListTraverser1; interface uses uList,uListIterator; type     TProcessItem = function(AItem: TObject): Boolean;     TListTraverser1 = class     private         FIterator: TListIterator;         FOnProcessItem: TProcessItem;     public         constructor Create(AList: TList1);         destructor Destroy; override;         //---         function Traverse(): Boolean;         //---         property OnProcessItem: TProcessItem read FOnProcessItem write FOnProcessItem;     end; function PrintEmployee(AItem: TObject): Boolean; implementation uses uEmployee; function PrintEmployee(AItem: TObject): Boolean; begin     TEmployee(AItem).Print;     Result := true; end; constructor TListTraverser1.Create(AList: TList1); begin     FIterator := TListIterator.Create(AList); end; destructor TListTraverser1.Destroy; begin     FIterator.Free;     //---     inherited; end; function TListTraverser1.Traverse: Boolean; begin     Result := false;     //---     if Assigned(FOnProcessItem) then     begin         with FIterator do         begin             First;             while not IsDone do             begin                 Result := FOnProcessItem(CurrentItem);                 if not Result then                     Break;                 //---                 Next;             end;         end;     end; end; end. procedure TForm1.Button7Click(Sender: TObject); var     AEmployees: TList1;     AIterator: TListTraverser1; begin     self.Memo1.Clear;     //---     AEmployees := TList1.Create;     try         with AEmployees do         begin             Add(TEmployee.Create('1',self.Memo1));             Add(TEmployee.Create('2',self.Memo1));             Add(TEmployee.Create('3',self.Memo1));         end;         //---         AIterator := TListTraverser1.Create(AEmployees);         try             AIterator.OnProcessItem := PrintEmployee;             AIterator.Traverse;         finally             AIterator.Free;         end;     finally         AEmployees.Free;     end; end;

    最新回复(0)