Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

  

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

Из описания Функтор Apache Commons для общего доступа Страница:


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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top