《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:内部迭代器(依赖于子类)

    技术2026-05-26  11

    示例:内部迭代器(依赖于子类) 说明: 下面是第二种实现办法的一个大体框架,它利用了子类生成。这里我们称内部迭代器为一个ListTraverser。 ListTraverser以一个List实例为参数。在内部,它使用一个外部ListIterator进行遍历。Traverse启动遍历并对每一元素项调用ProcessItem操作。内部迭代器可在某次ProcessItem操作返回false时提前终止本次遍历。而Traverse返回一个布尔值指示本次遍历是否提前终止。 代码: unit uListTraverser; interface uses uList,uListIterator; type     TListTraverser = class     private         FIterator: TListIterator;     protected         function ProcessItem(AItem: TObject): Boolean; virtual;abstract;     public         constructor Create(AList: TList1);         destructor Destroy; override;         //---         function Traverse(): Boolean;     end; implementation { TListTraverser } constructor TListTraverser.Create(AList: TList1); begin     FIterator := TListIterator.Create(AList); end; destructor TListTraverser.Destroy; begin     FIterator.Free;     //---     inherited; end; function TListTraverser.Traverse: Boolean; begin     Result := false;     //---     with FIterator do     begin         First;         while not IsDone do         begin             Result := self.ProcessItem(CurrentItem);             if not Result then                 Break;             //---             Next;         end;     end; end; end. unit uPrintNEmployees; interface uses uList,uListTraverser; type     TPrintNEmployees = class(TListTraverser)     private         FTotal: integer;         FCount: integer;     protected         function ProcessItem(AItem: TObject): Boolean; override;      public         constructor Create(AList: TList1;n:integer);     end; implementation uses uEmployee; constructor TPrintNEmployees.Create(AList: TList1; n: integer); begin     inherited Create(AList);     //---     FTotal := n;     FCount := 0; end; function TPrintNEmployees.ProcessItem(AItem: TObject): Boolean; begin     FCount := FCount + 1;     TEmployee(AItem).Print;     Result := FCount < FTotal; end; end. procedure TForm1.Button5Click(Sender: TObject);     //---使用内部迭代器     procedure _Test1;     var         AEmployees: TList1;         pa: TPrintNEmployees;         i: integer;     begin         self.Memo1.Clear;         //---         AEmployees := TList1.Create;         try             with AEmployees do             begin                 for i := 1 to 15 do                     Add(TEmployee.Create(IntToStr(i),self.Memo1));             end;             //---             pa := TPrintNEmployees.Create(AEmployees,10);             pa.Traverse;             pa.Free;         finally             AEmployees.Free;         end;     end;     //---使用外部迭代器     procedure _Test2;     var         AEmployees: TList1;         AIterator: TListIterator;         i,ACount: integer;     begin         self.Memo1.Clear;         //---         AEmployees := TList1.Create;         try             with AEmployees do             begin                 for i := 1 to 15 do                     Add(TEmployee.Create(IntToStr(i),self.Memo1));             end;             //---             AIterator := TListIterator.Create(AEmployees);             try                 with AIterator do                 begin                     ACount := 0;                     //---                     First;                     while not IsDone do                     begin                         inc(ACount);                         TEmployee(CurrentItem).Print;                         if ACount >= 10 then                             Break;                         //---                         Next;                     end;                 end;             finally                 AIterator.Free;             end;         finally             AEmployees.Free;         end;     end; begin     _Test2; end;

    最新回复(0)