Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Паттерн Command<br />
поместить лишь ссылку на команду. Команды, которые обязательно нужно<br />
копировать перед помещением в список истории, ведут себя подобно прототипам<br />
(см. описание паттерна прототип);<br />
а как избежать накопления ошибок в процессе отмены. При обеспечении надежного,<br />
сохраняющего семантику механизма отмены и повтора может возникнуть<br />
проблема гистерезиса. При выполнении, отмене и повторе команд<br />
иногда накапливаются ошибки, в результате чего состояние приложения<br />
оказывается отличным от первоначального. Поэтому порой необходимо сохранять<br />
в команде больше информации, дабы гарантировать, что объекты<br />
будут целиком восстановлены. Чтобы предоставить команде доступ к этой<br />
информации, не раскрывая внутреннего устройства объектов, можно воспользоваться<br />
паттерном хранитель;<br />
а применение шаблонов в C++. Для команд, которые не допускают отмену<br />
и не имеют аргументов, в языке C++ можно воспользоваться шаблонами, чтобы<br />
не создавать подкласс класса Command для каждой пары действие-получатель.<br />
Как это сделать, мы продемонстрируем в разделе «Пример кода».<br />
Пример кода<br />
Приведенный ниже код на языке C++ дает представление о реализации классов<br />
Command, обсуждавшихся в разделе «Мотивация». Мы определим классы<br />
OpenCommand, PasteCommand и MacroCommand. Сначала абстрактный класс<br />
Command:<br />
class Command {<br />
public:<br />
virtual ~Command ();<br />
virtual void Execute () = 0;<br />
protected:<br />
Command ( ) ;<br />
};<br />
Команда OpenCommand открывает документ, имя которому задает пользователь.<br />
Конструктору OpenCommand передается объект Application. Функция<br />
AskUser запрашивает у пользователя имя открываемого документа:<br />
class OpenCommand : public Command {<br />
public :<br />
OpenCommand (Application*) ;<br />
virtual void Execute ();<br />
protected:<br />
virtual const char* AskUser ();<br />
private:<br />
Application* _application;<br />
char* _response;<br />
};<br />
OpenCommand::OpenCommand (Application* a) {<br />
_application = a;<br />
}