Описывает решение проблемы. Главным образом, мы хотим выдавать команды и не хотим определять 30 методов для 8 классов для достижения этой цели. Используя упоминание шаблона, мы выдаем объект Command
, и объект может его игнорировать или каким-либо образом воздействовать на него. Сложность объекта Command
определяется реализацией, но это хороший способ сказать объектам: «Эй, сделай это».
Кроме того, поскольку мы инкапсулировали это в объекте, мы можем идти дальше и ставить команды в очередь, отправлять их с желаемыми интервалами, а также возвращать их (при условии, конечно, что объект, которому вы отправляете команду, может «отменить» команду а также «сделай это»).
Итак, представьте пакет для рисования, который позволяет добавлять фигуры на холст. Каждый раз, когда пользователь делает это, можно ввести команду:
m_Canvas.push_back(new Line(1.0f, 2.0f));
m_Canvas.push_back(new Line(3.5f, 3.1f));
m_Canvas.push_back(new Circle(2.0f, 3.0f, 1.5f));
и так далее. Предполагается, что Line
и Circle
получены из общего базового класса Command
.
Наш рендерер может использовать эту коллекцию холста как способ рендеринга, а неиспользование - это просто случай удаления последней выполненной команды. Отслеживая, что пользователь отменяет в отдельной коллекции, мы также можем повторить.