博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

//命令的接受者

unit uReceiveObject;

interface

type
  TLight = class(TObject)
  public
    procedure Open;
    procedure Off;
  end;

  TGarageDoor = class(TObject)
  public
    procedure Up;
    procedure Down;
    procedure Stop;
    procedure LightOn;
    procedure LightOff;
  end;

implementation

{ TLight }

procedure TLight.Off;
begin
  Writeln('');
end;

procedure TLight.Open;
begin
  Writeln('Light is On.');
end;

{ TGarageDoor }

procedure TGarageDoor.Down;
begin
  Writeln('');
end;

procedure TGarageDoor.LightOff;
begin
  Writeln('');
end;

procedure TGarageDoor.LightOn;
begin
  Writeln('');
end;

procedure TGarageDoor.Stop;
begin
  Writeln('');
end;

procedure TGarageDoor.Up;
begin
  Writeln('GarageDoor is Open.');
end;

end.

 

//命令对象

unit uCommandObject;

interface

uses
  uReceiveObject;

type
  TCommand = class(TObject)
  public
    procedure Execute; virtual; abstract;
  end;

  TLightOnCommand = class(TCommand)
  private
    FLight: TLight;
  public
    constructor Create(aLight: TLight);
    procedure Execute; override;
  end;

  TGarageDoorOpenCommand = class(Tcommand)
  private
    FGarageDoor: TGarageDoor;
  public
    constructor Create(aGarageDoor: TGarageDoor);
    procedure Execute; override;
  end;

implementation

{ TLightOnCommand }

constructor TLightOnCommand.Create(aLight: TLight);
begin
  FLight := aLight;
end;

procedure TLightOnCommand.Execute;
begin
  FLight.Open;
end;

{ TGarageDoorOpenCommand }

constructor TGarageDoorOpenCommand.Create(aGarageDoor: TGarageDoor);
begin
  FGarageDoor := aGarageDoor;
end;

procedure TGarageDoorOpenCommand.Execute;
begin
  FGarageDoor.Up;
end;

end.

 

//命令的请求者即发出者

unit uSimpleRemoteControl;

interface

uses
  uCommandObject;

type
  TSimpleRemoteControl = class(TObject)
  private
    FSlot: TCommand;
  public
    procedure SetCommand(aCommand: TCommand);
    procedure ButtonWasPressed;
  end;

implementation

{ TSimpleRemoteControl }

procedure TSimpleRemoteControl.ButtonWasPressed;
begin
  FSlot.Execute;
end;

procedure TSimpleRemoteControl.SetCommand(aCommand: TCommand);
begin
  FSlot := aCommand;
end;

end.

 

//客户端代码

program pSimpleRemoteControlTest;

{$APPTYPE CONSOLE}

uses
  uSimpleRemoteControl in 'uSimpleRemoteControl.pas',
  uCommandObject in 'uCommandObject.pas',
  uReceiveObject in 'uReceiveObject.pas';

var
  Remote: TSimpleRemoteControl;
  Light: TLight;
  GarageDoor: TGarageDoor;
  LightOnCommand: TCommand;
  GarageDoorOpenCommand: TCommand;
 
begin
  {创建命令的发出者}
  Remote := TSimpleRemoteControl.Create;

  {创建命令的接收者}
  Light := TLight.Create;
  GarageDoor := TGarageDoor.Create;

  {创建具体的命令对象}
  LightOnCommand := TLightOnCommand.Create(Light);
  GarageDoorOpenCommand := TGarageDoorOpenCommand.Create(GarageDoor);

  {加载命令并执行}
  Remote.SetCommand(LightOnCommand);
  Remote.ButtonWasPressed;
  Remote.SetCommand(GarageDoorOpenCommand);
  Remote.ButtonWasPressed;

  Remote.Free;
  Light.Free;
  GarageDoor.Free;
  LightOnCommand.Free;
  GarageDoorOpenCommand.Free;
 
  Readln;
end.

//运行结果