09.04.2016 Views

Priemioop

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 />

}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!