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

来源:互联网 发布:java编程规范 pdf 编辑:程序博客网 时间:2024/05/22 13:26

示例:内部迭代器(使用函数指针)
说明:
通过给迭代器传递一个函数指针(全局的或静态的)来实现内部迭代器。

代码:
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;