В чем разница между функтором и шаблоном Command? - PullRequest
12 голосов
/ 03 ноября 2008

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

Ответы [ 7 ]

17 голосов
/ 03 ноября 2008

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

«Командный шаблон» является шаблоном проектирования.
Функтор является одним из способов реализации «шаблона команд».

7 голосов
/ 16 января 2009

Вот ответ от GOF :

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

7 голосов
/ 03 ноября 2008

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

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

5 голосов
/ 03 ноября 2008

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


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

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

  • программирование в функциональном стиле
  • функции высшего порядка
  • внутренние итераторы
  • повторное использование и специализация посредством композиции, а не наследования и перегрузки
  • универсальные API "callback" или "точка расширения"
  • универсальные «фильтры» или API предикатов
  • множество «поведенческих» шаблонов проектирования, таких как посетитель, стратегия, цепь ответственности и т. Д.
4 голосов
/ 17 мая 2011

Согласно приведенному GOF (Gang of Four) определению (по Comptrol), Functor и Command - это два разных паттерна.

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

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

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

3 голосов
/ 03 ноября 2008

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

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

3 голосов
/ 03 ноября 2008

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

...