📄 citerator.pas
字号:
{-----------------------------------------------------------------------------
Unit Name: CIterator
Author: hubdog(陈省)
Email: hubdog@263.net
Purpose: 演示Iterator模式的应用
History:
2003-6-12 创建本单元
-----------------------------------------------------------------------------}
unit CIterator;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Contnrs, StdCtrls;
type
//员工列表
TPeople=class(TObjectList)
end;
//公司员工
TPerson=class(TObject)
private
FIsLeader: Boolean;
FNewExployee: Boolean;
FMoney: Double;
FName: string;
procedure SetIsLeader(const Value: Boolean);
procedure SetMoney(const Value: Double);
procedure SetName(const Value: string);
procedure SetNewExployee(const Value: Boolean);
public
property Name:string read FName write SetName;//姓名
property NewExployee:Boolean read FNewExployee write SetNewExployee;//是否是新员工
property IsLeader:Boolean read FIsLeader write SetIsLeader;//是否是领导
property Money:Double read FMoney write SetMoney;//收入的钱
end;
//要执行的操作
TTask=procedure (APerson:TPerson) of object;
//被动迭代器接口
IPassiveIterator=interface
['{AF8EE210-D3DA-4AD6-9CDA-1B6F46BE80D6}']
procedure Iterate(ATask:TTask);
end;
//过滤新员工
TOldEmployeeIterator=class(TInterfacedObject, IPassiveIterator)
private
FPeople:TPeople;
public
constructor Create(APeople:TPeople);
procedure Iterate(ATask:TTask);
end;
//过滤领导
TLeaderIterator=class(TInterfacedObject, IPassiveIterator)
private
FPeople:TPeople;
public
constructor Create(APeople:TPeople);
procedure Iterate(ATask:TTask);
end;
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
btn3: TButton;
btn4: TButton;
btn5: TButton;
btn6: TButton;
procedure FormCreate(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure btn4Click(Sender: TObject);
procedure btn5Click(Sender: TObject);
procedure btn6Click(Sender: TObject);
private
{ Private declarations }
FPeople:TPeople;
public
{ Public declarations }
procedure bonus1( APerson:TPerson);
procedure bonus2( APerson:TPerson);
procedure bonus3( APerson:TPerson);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
//初始化演示数据
FPeople:=TPeople.Create;
end;
{ TPerson }
procedure TPerson.SetIsLeader(const Value: Boolean);
begin
FIsLeader := Value;
end;
procedure TPerson.SetMoney(const Value: Double);
begin
FMoney := Value;
end;
procedure TPerson.SetName(const Value: string);
begin
FName := Value;
end;
procedure TPerson.SetNewExployee(const Value: Boolean);
begin
FNewExployee := Value;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
I:Integer;
Person:TPerson;
begin
//发绩效奖金
for I:=0 to FPeople.Count-1 do
begin
Person:=TPerson(FPeople.Items[I]);
//如果不是新员工的话
if not Person.NewExployee then
Person.Money:=Person.Money+100;
end;
end;
procedure TForm1.btn2Click(Sender: TObject);
var
I:Integer;
Person:TPerson;
begin
//发手机费
for I:=0 to FPeople.Count-1 do
begin
Person:=TPerson(FPeople.Items[I]);
//如果是领导的话
if Person.IsLeader then
Person.Money:=Person.Money+200;
end;
end;
procedure TForm1.btn3Click(Sender: TObject);
var
I:Integer;
Person:TPerson;
begin
//发招待费
for I:=0 to FPeople.Count-1 do
begin
Person:=TPerson(FPeople.Items[I]);
//如果是领导的话
if Person.IsLeader then
Person.Money:=Person.Money+1000;
end;
end;
{ TOldEmployeeIterator }
constructor TOldEmployeeIterator.Create(APeople: TPeople);
begin
FPeople:=APeople;
end;
procedure TOldEmployeeIterator.Iterate(ATask: TTask);
var
I:Integer;
APerson:TPerson;
begin
for I:=0 to FPeople.Count-1 do
begin
APerson:=TPerson(FPeople.Items[I]);
if not APerson.NewExployee then
ATask(APerson);
end;
end;
{ TLeaderIterator }
constructor TLeaderIterator.Create(APeople: TPeople);
begin
FPeople:=APeople;
end;
procedure TLeaderIterator.Iterate(ATask: TTask);
var
I:Integer;
APerson:TPerson;
begin
for I:=0 to FPeople.Count-1 do
begin
APerson:=TPerson(FPeople.Items[I]);
if APerson.IsLeader then
ATask(APerson);
end;
end;
procedure TForm1.btn4Click(Sender: TObject);
begin
//发绩效奖金
with TOldEmployeeIterator.Create(FPeople) do
Iterate(bonus1);
end;
procedure TForm1.bonus1(APerson: TPerson);
begin
//发绩效奖金
APerson.Money:=APerson.Money+100;
end;
procedure TForm1.bonus2(APerson: TPerson);
begin
//发手机费
APerson.Money:=APerson.Money+200;
end;
procedure TForm1.bonus3(APerson: TPerson);
begin
//发招待费
APerson.Money:=APerson.Money+1000;
end;
procedure TForm1.btn5Click(Sender: TObject);
begin
//发手机费
with TLeaderIterator.Create(FPeople) do
Iterate(bonus2);
end;
procedure TForm1.btn6Click(Sender: TObject);
begin
//发招待费
with TLeaderIterator.Create(FPeople) do
Iterate(bonus3);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -