В чем разница между шаблоном Functor и Command?

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

Ответ 1

Функтор - это понятие "синтаксический уровень" - он обрабатывает код в объекте, который можно рассматривать синтаксически как указатель на функцию, то есть его можно "вызвать", поместив список параметров в скобки после него. В С++ вы можете сделать класс функтором, переопределив operator().

A Команда в шаблоне команд - это объект, который упаковывает некоторые функциональные возможности, но не требует, чтобы он был функтором. Например, это может быть класс, реализующий интерфейс ICommand, позволяющий выполнять его команду, вызывая Do().

Ответ 2

Функтор - это реализация, способ создания объекта как функция.

"Шаблон команды" - это шаблон дизайна.
Функтор является одним из способов реализации "Command Pattern".

Ответ 3

Вот ответ из GOF:

Coplien описывает, как реализовать функторы, объекты, которые являются функциями, в С++ [Cop92]. Он достигает степени прозрачности в их использовании посредством перегрузка оператора вызова функции (Оператор()). Шаблон команды другой; его основное внимание уделяется поддержанию привязка между приемником и функции (т.е. действия), а не только сохранение функции.

Ответ 4

Из описания страницы Apocal Commons Functor:


Функтор - это функция, которую можно манипулировать как объект или объект, представляющий единую общую функцию.

Функторы поддерживают и поощряют ряд мощных методов программирования, включая:

  • программирование в функциональном стиле
  • функции более высокого порядка Внутренние итераторы
  • повторное использование и специализация с помощью композиции, а не наследования и перегрузки
  • общие "обратные вызовы" или "API точки расширения"
  • общие "фильтры" или предикатные API
  • многие "поведенческие" шаблоны проектирования, такие как "Посетитель", "Стратегия", "Цепь ответственности" и т.д.

Ответ 5

В соответствии с приведенным в GOF (Gang of Four) определением (по Comptrol), Functor и Command представляют собой два разных шаблона.

Как уже было сказано, Functor представляет класс, содержащий сервисный метод, в других терминах: основная ответственность за класс функтора заключается в том, чтобы хранить конкретную логику, реализованную по своему собственному методу. Следовательно, мы можем думать у функтора, как контейнер для собственного метода внутренней логики. Исторически сложилось, что Functor родился потому, что в спецификации Java нет реализации и/или концепции "указателя функции", что очень полезно в контексте зарегистрированных обратных вызовов (конкретная реализация для шаблона наблюдателя).

Шаблон команды представляет шаблон проектирования, предназначенный для развязки объекта Invoker из приемника. Он используется главным образом, когда требуется отменить действия (генерирующие события) от прослушивателей действий (подумайте о GUI). Он имеет метод, ответственный за исключение конкретной операции (в зависимости от конкретной реализации команды от собственного суперкласса), относящейся к определенному объекту Receiver; в заявленном определении метод выполнения может быть определен как "не умный", на самом деле с помощью интеллектуальной реализации может быть сам реализовать оперативную логику вместо делегирования ее третьему объекту. Когда у нас есть метод интеллектуального исполнения, мы реализуем функтор, и мы помещаем функтор (конкретная реализация подпрограммы команды) в контексте шаблона команды.

Я надеюсь, что это будет полезно для вас.

Ответ 6

Я думаю, что функтор является компонентом шаблона команды, который также включает в себя другую инфраструктуру, такую ​​как получатели вызова и команды.

Ответ 7

Шаблон команды используется в Java, потому что у нас нет замыканий на Java. Функторы - попытка реализовать закрытие.

Язык с закрытием не нуждается в шаблоне Command.