Обзор темы [Шаблоны проектирования]

Затем: МотивацияНазначение

Инкапсулирует запрос в объект, так чтобы клиенты могли быть параметризованы запросами, очередями запросов или их логами, таким образом осуществляет поддержку операции undo.

Затем: СтруктураМотивация

Иногда необходимо осуществлять запросы, не зная, ни какая операция произойдет в результате запроса, ни того, кто является приемником запроса. Например, toolkit интерфейса пользователя включают такие объекты как кнопки и меню, которые выполняют запрос в ответ на действия пользователя. Но toolkit не может выполнять запрос явно поскольку только сами приложения, использующие комплект инструментальных средств, знают что должно быть произведено и с каким объектом. Как проектировщики комплекта инструментальных средств мы не знаем ничего о приемнике запроса или операций, которую необходимо выполнить.

Шаблон Command позволяет объектам toolkit делать запросы неопределенным объектам, представляя сам запрос как объект. Этот объект может быть сохранен и передан как любые другие объекты. Ключевым в этом шаблоне является абстрактный класс Command, который определяет интерфейс для выполнения операций. В самой простой форме этот интерфейс включает абстрактную операцию Execute. Конкретный Command сохраняет состояние приемника и вызывает Execute, чтобы выполнить запрос. Таким образом, у приемника есть все необходимые данные для того, чтобы обработать запрос.

Обычные меню могут быть легко реализованы как объекты Command. Каждый пункт Меню - экземпляр класса MenuItem. Класс Application создает само меню и пункты меню наряду с остальной частью интерфейса пользователя. Класс Application также следит за объектами Document, которые клинт открыл.

Приложение конфигурирует каждый MenuItem с экземпляром конкретного подкласса Command. Когда пользователь выбирает MenuItem, тот вызывает Execute для своей комманды. MenuItems не знают, который подкласс Command они используют. Подклассы Command сохраняют приемник запроса и вызывают одну или несколько операций над приемником.

Например, PasteCommand поддерживает текст вставки из clipboard в Document. Приемником PasteCommand является активный объект Document. Операция Execute вызывает Paste на Documnet.

Операция Execute OpenCommand действует по-другому: она запрашивает у пользователя имя документа, создает соответствующий объект Document, добавляет его к приложению, и открывает документ.

Иногда MenuItem должны выполнять последовательности команд. Например, MenuItem для центрирования страници с нормированием размера может быть построен из объекта CenterDocumentCommand и NormalSizeCommand. Мы можем определить класс MacroCommand, чтобы позволить MenuItem выполнять произвольное число команд. Макрокоманда - конкретный подкласс Command, который просто выполняет последовательность Command. Макрокоманда не имеет никакого явного приемника, потому что командует элемента последовательности определить их собственных приемников.

Обратите внимание на то, как что в каждом из этих примеров шаблон отделяет объект, вызывающий действие от того, который знает как его выполнить. Это позволяет сделать наш пользовательский интерфейс намного более гибким. Приложение может заставить и пункт меню и кнопку работать одинаково, снабжая их одним и тем же экземпляром подкласса Command. Мы можем заменять команды динамически, например, для реализации которые контекстно-зависимых меню. Мы можем также поддерживать сценарии команд.

Затем: Составные частиСтруктура

Составные части