命令模式可以很轻松的实现撤销(Undo)功能。 1. 命令的接受者 unit uReceiveObject; interface type TLight = class(TObject) public procedure Open; procedure Off; end; implementation { TLight } procedure TLight.Off; begin Writeln('Light is off.'); end; procedure TLight.Open; begin Writeln('Light is on.'); end; end. 2.命令对象 unit uReceiveObject; interface type TLight = class(TObject) public procedure Open; procedure Off; end; implementation { TLight } procedure TLight.Off; begin Writeln('Light is off.'); end; procedure TLight.Open; begin Writeln('Light is on.'); end; end. 3.命令的请求者 unit uSimpleRemoteWithUndo; interface uses uCommandObject; type TSimpleRemoteWithUndo = class(TObject) private FOnCommand : TCommand; FOffCommand : TCommand; FUndoCommand: TCommand; public procedure SetCommand(aOnCommand, aOffCommand: TCommand); procedure OnButtonWasPressed; procedure OffButtonWasPressed; procedure UndoButtonWasPressed; end; implementation { TSimpleRemoteWithUndo } procedure TSimpleRemoteWithUndo.OffButtonWasPressed; begin FOffCommand.Execute; FUndoCommand := FOffCommand; end; procedure TSimpleRemoteWithUndo.OnButtonWasPressed; begin FOnCommand.Execute; FUndoCommand := FOnCommand; end; procedure TSimpleRemoteWithUndo.SetCommand(aOnCommand, aOffCommand: TCommand); begin FOnCommand := aOnCommand; FOffCommand := aOffCommand; end; procedure TSimpleRemoteWithUndo.UndoButtonWasPressed; begin FUndoCommand.Undo; end; end. 4.客户端,创建具体的命令 program pSimpleRemoteWithUndoTest; {$APPTYPE CONSOLE} uses uSimpleRemoteWithUndo in 'uSimpleRemoteWithUndo.pas', uCommandObject in 'uCommandObject.pas', uReceiveObject in 'uReceiveObject.pas'; var Remote: TSimpleRemoteWithUndo; Light : TLight; LightOnCommand : TCommand; LightOffCommand: TCommand; begin Remote := TSimpleRemoteWithUndo.Create; Light := TLight.Create; LightOnCommand := TLightOnCommand.Create(Light); LightOffCommand := TLightOffCommand.Create(Light); Remote.SetCommand(LightOnCommand, LightOffCommand); Remote.OnButtonWasPressed; Remote.OffButtonWasPressed; Remote.UndoButtonWasPressed; Writeln; Remote.OffButtonWasPressed; Remote.OnButtonWasPressed; Remote.UndoButtonWasPressed; Remote.Free; Light.Free; LightOnCommand.Free; LightOffCommand.Free; Readln; end. 运行结果: