示例:命令接口
说明:
(1)、定义
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
(2)、结构
命令:
Command:命令对象。声明执行操作的接口。
ConcreteCommand:具体命令对象。将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现Execute。
Invoker:发送者对象。要求该命令执行这个请求。
Receiver:接收者对象。知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。
客户:
Client:客户端。创建一个具体命令对象并设定它的接收者。
代码:
unit uCommand;
interface
uses
SysUtils,Dialogs,Contnrs;
type
TReceiver = class;
TCommand = class
public
procedure Execute(); virtual; abstract;
end;
TConcreteCommand = class(TCommand)
private
FReceiver: TReceiver;
FState: Integer;
public
constructor Create(AReceiver: TReceiver);
//---
procedure Execute; override;
end;
TReceiver = class
private
FState: Integer;
public
constructor Create;
//---
procedure Action();
//---
property State: Integer read FState write FState;
end;
TInvoker = class
private
FCommands: TObjectList;
public
constructor Create;
destructor Destroy; override;
//---
procedure StoreCommand(ACommand: TCommand);
procedure Execute();
end;
implementation
constructor TConcreteCommand.Create(AReceiver: TReceiver);
begin
inherited Create;
//---
FReceiver := AReceiver;
end;
procedure TConcreteCommand.Execute;
begin
FState := FReceiver.State;
FReceiver.Action;
end;
procedure TReceiver.Action;
begin
ShowMessage(IntToStr(FState));
FState := FState + 1;
end;
constructor TInvoker.Create;
begin
FCommands := TObjectList.Create;
end;
destructor TInvoker.Destroy;
begin
FCommands.Free;
//---
inherited;
end;
procedure TInvoker.StoreCommand(ACommand: TCommand);
begin
FCommands.Add(ACommand);
end;
procedure TInvoker.Execute();
var
ACommand: TCommand;
begin
while FCommands.Count > 0 do
begin
ACommand := TCommand(FCommands.First);
ACommand.Execute;
//---
FCommands.Delete(0);
end;
end;
constructor TReceiver.Create;
begin
FState := 1;
end;
end.
procedure TForm2.Button1Click(Sender: TObject);
var
AReceiver: TReceiver;
AInvoker: TInvoker;
ACommand: TCommand;
begin
AInvoker := TInvoker.Create;
AReceiver := TReceiver.Create;
try
with AInvoker do
begin
ACommand := TConcreteCommand.Create(AReceiver);
StoreCommand(ACommand);
//---
ACommand := TConcreteCommand.Create(AReceiver);
StoreCommand(ACommand);
//---
Execute;
end;
finally
AReceiver.Free;
AInvoker.Free;
end;
end;
《GOF设计模式》—命令(COMMAND)—Delphi源码示例:命令接口
最新推荐文章于 2021-10-27 13:27:59 发布