《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:迭代器接口
2011-02-18 09:36
711 查看
示例:迭代器接口
说明:
(1)、定义
提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
(2)、结构
![](http://hi.csdn.net/attachment/201102/18/0_129802177403Cn.gif)
迭代器:
Iterator(迭代器):迭代器定义访问和遍历元素的接口。
ConcreteIterator(具体迭代器):具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。
聚合:
Aggregate(聚合):聚合定义创建相应迭代器对象的接口。
ConcreteAggregate(具体聚合):具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
协作:
ConcreteIterator跟踪聚合中的当前对象,并能够计算出待遍历的后继对象。
代码:
unit uIterator1;
interface
uses
SysUtils,Classes,Dialogs;
type
TConcreteAggregate = class;
TIterator = class
public
procedure First(); virtual; abstract;
procedure Next(); virtual; abstract;
function IsDone(): Boolean; virtual; abstract;
function CurrentItem(): string; virtual; abstract;
end;
TConcreteIterator = class(TIterator)
private
FAggregate: TConcreteAggregate;
FCurrent: integer;
public
constructor Create(const Aggregate: TConcreteAggregate);
//---
procedure First(); override;
procedure Next(); override;
function IsDone(): Boolean; override;
function CurrentItem: string; override;
end;
TAggregate = class
public
function CreateIterator(): TIterator; virtual; abstract;
end;
TConcreteAggregate = class(TAggregate)
private
FList:TStringList;
function GetCount: integer;
function GetItems(Index: integer): string;
public
constructor Create;
destructor Destroy; override;
//---
function CreateIterator: TIterator; override;
procedure Add(s:string);
//---
property Count: integer read GetCount;
property Items[Index: integer]: string read GetItems; default;
end;
procedure Test;
implementation
procedure Test;
//---
procedure _ShowAggregate(I:TIterator);
begin
I.First;
while not I.IsDone do
begin
ShowMessage(I.CurrentItem);
I.Next;
end;
end;
var
Aggregate: TConcreteAggregate;
AIterator: TIterator;
begin
Aggregate := TConcreteAggregate.Create;
try
with Aggregate do
begin
Add('111');
Add('222');
Add('333');
end;
//---
AIterator := Aggregate.CreateIterator;
_ShowAggregate(AIterator);
AIterator.Free;
finally
Aggregate.Free;
end;
end;
constructor TConcreteIterator.Create(const Aggregate: TConcreteAggregate);
begin
FAggregate := Aggregate;
FCurrent := 0;
end;
procedure TConcreteIterator.First;
begin
FCurrent := 0;
end;
procedure TConcreteIterator.Next;
begin
FCurrent := FCurrent + 1;
end;
function TConcreteIterator.IsDone: Boolean;
begin
Result := FCurrent >= FAggregate.Count;
end;
function TConcreteIterator.CurrentItem: string;
begin
if self.IsDone then
raise Exception.Create('Iterator Out Of Bounds');
//---
Result := FAggregate.Items[FCurrent];
end;
constructor TConcreteAggregate.Create;
begin
FList := TStringList.Create;
end;
destructor TConcreteAggregate.Destroy;
begin
FList.Free;
//---
inherited;
end;
function TConcreteAggregate.CreateIterator: TIterator;
begin
Result := TConcreteIterator.Create(self);
end;
function TConcreteAggregate.GetCount: integer;
begin
Result := FList.Count;
end;
function TConcreteAggregate.GetItems(Index: integer): string;
begin
Result := FList[Index];
end;
procedure TConcreteAggregate.Add(s: string);
begin
FList.Add(s);
end;
end.
说明:
(1)、定义
提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
(2)、结构
![](http://hi.csdn.net/attachment/201102/18/0_129802177403Cn.gif)
迭代器:
Iterator(迭代器):迭代器定义访问和遍历元素的接口。
ConcreteIterator(具体迭代器):具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。
聚合:
Aggregate(聚合):聚合定义创建相应迭代器对象的接口。
ConcreteAggregate(具体聚合):具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
协作:
ConcreteIterator跟踪聚合中的当前对象,并能够计算出待遍历的后继对象。
代码:
unit uIterator1;
interface
uses
SysUtils,Classes,Dialogs;
type
TConcreteAggregate = class;
TIterator = class
public
procedure First(); virtual; abstract;
procedure Next(); virtual; abstract;
function IsDone(): Boolean; virtual; abstract;
function CurrentItem(): string; virtual; abstract;
end;
TConcreteIterator = class(TIterator)
private
FAggregate: TConcreteAggregate;
FCurrent: integer;
public
constructor Create(const Aggregate: TConcreteAggregate);
//---
procedure First(); override;
procedure Next(); override;
function IsDone(): Boolean; override;
function CurrentItem: string; override;
end;
TAggregate = class
public
function CreateIterator(): TIterator; virtual; abstract;
end;
TConcreteAggregate = class(TAggregate)
private
FList:TStringList;
function GetCount: integer;
function GetItems(Index: integer): string;
public
constructor Create;
destructor Destroy; override;
//---
function CreateIterator: TIterator; override;
procedure Add(s:string);
//---
property Count: integer read GetCount;
property Items[Index: integer]: string read GetItems; default;
end;
procedure Test;
implementation
procedure Test;
//---
procedure _ShowAggregate(I:TIterator);
begin
I.First;
while not I.IsDone do
begin
ShowMessage(I.CurrentItem);
I.Next;
end;
end;
var
Aggregate: TConcreteAggregate;
AIterator: TIterator;
begin
Aggregate := TConcreteAggregate.Create;
try
with Aggregate do
begin
Add('111');
Add('222');
Add('333');
end;
//---
AIterator := Aggregate.CreateIterator;
_ShowAggregate(AIterator);
AIterator.Free;
finally
Aggregate.Free;
end;
end;
constructor TConcreteIterator.Create(const Aggregate: TConcreteAggregate);
begin
FAggregate := Aggregate;
FCurrent := 0;
end;
procedure TConcreteIterator.First;
begin
FCurrent := 0;
end;
procedure TConcreteIterator.Next;
begin
FCurrent := FCurrent + 1;
end;
function TConcreteIterator.IsDone: Boolean;
begin
Result := FCurrent >= FAggregate.Count;
end;
function TConcreteIterator.CurrentItem: string;
begin
if self.IsDone then
raise Exception.Create('Iterator Out Of Bounds');
//---
Result := FAggregate.Items[FCurrent];
end;
constructor TConcreteAggregate.Create;
begin
FList := TStringList.Create;
end;
destructor TConcreteAggregate.Destroy;
begin
FList.Free;
//---
inherited;
end;
function TConcreteAggregate.CreateIterator: TIterator;
begin
Result := TConcreteIterator.Create(self);
end;
function TConcreteAggregate.GetCount: integer;
begin
Result := FList.Count;
end;
function TConcreteAggregate.GetItems(Index: integer): string;
begin
Result := FList[Index];
end;
procedure TConcreteAggregate.Add(s: string);
begin
FList.Add(s);
end;
end.
相关文章推荐
- 《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:内部迭代器(依赖于子类)
- 《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:内部迭代器(封装不同类型的迭代)
- 《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:健壮的迭代器
- 《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:用于复合对象的外部迭代器
- 《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:用于复合对象的内部迭代器
- 《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:基于游标的迭代器
- 《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:外部迭代器
- 《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:避免限定于一种特定的列表实现(一般迭代)
- 《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:避免限定于一种特定的列表实现(多态迭代)
- 《GOF设计模式》—迭代器 (ITERATOR)—Delphi源码示例:内部迭代器(使用函数指针)
- 《GOF设计模式》—组合(COMPOSITE)—Delphi源码示例:组合接口
- 《GOF设计模式》—原型(Prototype)—Delphi源码示例:原型接口
- 《GOF设计模式》—中介者 (MEDIATOR)—Delphi源码示例:中介者接口
- 《GOF设计模式》—策略(STRATEGY)—Delphi源码示例:策略接口
- 《GOF设计模式》—模板方法(TEMPLATE METHOD)—Delphi源码示例:模板方法接口
- 《GOF设计模式》—状态(STATE)—Delphi源码示例:状态接口
- 《GOF设计模式》—备忘录(MEMENTO)—Delphi源码示例:一个反映备忘录模式的迭代接口
- 《GOF设计模式》—组合(COMPOSITE)—Delphi源码示例:最大化Component接口
- 《GOF设计模式》—装饰(DECORATOR)—Delphi源码示例:装饰接口
- 《GOF设计模式》—生成器(Builder)—Delphi源码示例:生成器接口