⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cvisitor.pas

📁 delphi深度探索第二版随书光盘所附内容
💻 PAS
字号:
{-----------------------------------------------------------------------------
 Unit Name: CIterator
 Author:    hubdog(陈省)
 Email:     hubdog@263.net
 Purpose:   演示Visitor模式的应用
 History:
            2003-6-12 创建本单元
-----------------------------------------------------------------------------}


unit CVisitor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Contnrs, StdCtrls;

type

  TOperation=class(TObject)
  public
    Execute(APerson:TObject);virtual;abstract;
  end;

  //提供免费午餐
  TFoodOperation=class(TOperation)
  public
    Execute(APerson:TObject):override;
  end;

  //员工列表
  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;

  //临时工
  TTemporyPerson=class(TObject)
  end;

  //被动迭代器接口
  IPassiveIterator=interface
  ['{AF8EE210-D3DA-4AD6-9CDA-1B6F46BE80D6}']
    procedure Iterate(AOperation:TOperation);
  end;

  //迭代子
  TAllIterator=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 }


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 + -