说明: Dylan中的Collection提供了一个反映备忘录模式的迭代接口。Dylan的集合有一个"状态"对象的概念,它是一个表示迭代状态的备忘录。每一个集合可以按照它所选择的任意方式表示迭代的当前状态;该表示对客户完全不可见。 代码: unit uCollection; interface uses Dialogs,Contnrs; type TItem = class private FValue:string; public constructor Create(const AValue:string); //--- procedure Process(); end; TIterationState = class private FCurrent: Integer; public constructor Create; end; TCollection = class private FList: TObjectList; public constructor Create; destructor Destroy; override; //--- function CreateInitialState: TIterationState; function Copy(AState: TIterationState): TIterationState; //--- procedure Next(AState: TIterationState); function IsDone(AState: TIterationState): boolean; function CurrentItem(AState: TIterationState): TObject; //--- procedure Append(AItem: TObject); procedure Remove(AItem: TObject); end; implementation function TCollection.CreateInitialState: TIterationState; begin Result := TIterationState.Create; end; function TCollection.Copy(AState: TIterationState): TIterationState; begin Result := TIterationState.Create; Result.FCurrent := AState.FCurrent; end; constructor TCollection.Create; begin FList := TObjectList.Create; end; destructor TCollection.Destroy; begin FList.Free; //--- inherited; end; function TCollection.CurrentItem(AState: TIterationState): TObject; begin Result := FList[AState.FCurrent]; end; function TCollection.IsDone(AState: TIterationState): boolean; begin Result := AState.FCurrent >= FList.Count; end; procedure TCollection.Next(AState: TIterationState); begin with AState do FCurrent := FCurrent + 1; end; procedure TCollection.Append(AItem: TObject); begin FList.Add(AItem); end; procedure TCollection.Remove(AItem: TObject); begin FList.Remove(AItem); end; constructor TIterationState.Create; begin FCurrent := 0; end; constructor TItem.Create(const AValue: string); begin FValue := AValue; end; procedure TItem.Process; begin ShowMessage(FValue); end; end. procedure TForm3.Button1Click(Sender: TObject); var ACollection: TCollection; AState: TIterationState; begin ACollection := TCollection.Create; try with ACollection do begin Append(TItem.Create('1')); Append(TItem.Create('2')); Append(TItem.Create('3')); //--- AState := CreateInitialState(); try while not IsDone(AState) do begin TItem(CurrentItem(AState)).Process(); Next(AState); end; finally AState.Free; end; end; finally ACollection.Free; end; end; procedure TForm3.Button2Click(Sender: TObject); var ACollection: TCollection; AState,AState1: TIterationState; begin ACollection := TCollection.Create; try with ACollection do begin Append(TItem.Create('1')); Append(TItem.Create('2')); Append(TItem.Create('3')); //--- AState := CreateInitialState(); try while not IsDone(AState) do begin TItem(CurrentItem(AState)).Process(); Next(AState); //--- AState1 := Copy(AState); try while not IsDone(AState1) do begin TItem(CurrentItem(AState1)).Process(); Next(AState1); end; finally AState1.Free; end; end; finally AState.Free; end; end; finally ACollection.Free; end; end;