📄 cmediator.pas
字号:
{-----------------------------------------------------------------------------
Unit Name: CMediator
Author: hubdog(陈省)
Email: hubdog@263.net
Purpose: 演示Mediator模式的使用
History:
2003-6-20 创建本单元
-----------------------------------------------------------------------------}
unit CMediator;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TPerson = class(TObject)
public
Name: string;
SafeFee: Double;
PhoneFee: Double;
Salary: Double;
end;
//调停者
TMediator = class(TObject)
public
procedure ControlChanged(AControl: TControl); virtual;
end;
TFormMediator = class(TForm)
lstPerson: TListBox;
pnlPerson: TPanel;
edtName: TEdit;
lbl1: TLabel;
lbl3: TLabel;
edtSafe: TEdit;
lbl4: TLabel;
edtSalary: TEdit;
lbl5: TLabel;
edtPhone: TEdit;
procedure FormCreate(Sender: TObject);
procedure lstPersonClick(Sender: TObject);
procedure edtNameChange(Sender: TObject);
private
{ Private declarations }
FMediator: TMediator;
FObjectIndex: Integer;
public
{ Public declarations }
end;
var
FormMediator: TFormMediator;
implementation
{$R *.dfm}
procedure TFormMediator.FormCreate(Sender: TObject);
var
APerson: TPerson;
begin
//创建mediator
FMediator := TMediator.Create;
//初始化列表,添加员工
APerson := TPerson.Create;
APerson.Name := '哈巴狗';
APerson.SafeFee := 200;
APerson.PhoneFee := 500;
APerson.Salary := 5000;
lstPerson.Items.AddObject(APerson.Name, APerson);
APerson := TPerson.Create;
APerson.Name := '大尾巴兔兔';
APerson.Salary := 50000;
APerson.SafeFee:=0;
APerson.PhoneFee:=200;
lstPerson.Items.AddObject(APerson.Name, APerson);
lstPerson.ItemIndex := 0;
//调用调停者的方法通知变更
FObjectIndex := 0;
FMediator.ControlChanged(lstPerson);
end;
{ TMediator }
procedure TMediator.ControlChanged(AControl: TControl);
begin
with FormMediator do
begin
if AControl = edtName then
begin
TPerson(lstPerson.Items.Objects[FObjectIndex]).Name:=edtName.Text;
lstPerson.Items.Strings[FObjectIndex]:=edtName.Text;
end
else if AControl = edtSafe then
begin
TPerson(lstPerson.Items.Objects[FObjectIndex]).SafeFee:=StrToFloat(edtSafe.Text);
end
else if AControl = edtPhone then
begin
TPerson(lstPerson.Items.Objects[FObjectIndex]).PhoneFee:=StrToFloat(edtPhone.Text);
end
else if AControl = edtSalary then
begin
TPerson(lstPerson.Items.Objects[FObjectIndex]).Salary:=StrToFloat(edtSalary.Text);
end
else if AControl=lstPerson then
begin
with TPerson(lstPerson.Items.Objects[FObjectIndex]) do
begin
edtName.Text:=Name;
edtSafe.Text:=floattostr(SafeFee);
edtPhone.Text:=floattostr(PhoneFee);
edtSalary.Text:=floattostr(Salary);
end;
end;
end;
end;
procedure TFormMediator.lstPersonClick(Sender: TObject);
begin
//判断是否发生变更
if lstPerson.ItemIndex <> FObjectIndex then
begin
FObjectIndex := lstPerson.ItemIndex;
FMediator.ControlChanged(lstPerson);
end;
end;
procedure TFormMediator.edtNameChange(Sender: TObject);
begin
//发生变更时,更新数据
FMediator.ControlChanged(Sender as TControl);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -