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

Оператор == проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals() проверьте фактическое содержимое строки (значение).

Обратите внимание, что метод .equals() принадлежит классу Object (суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.

  • Случай 1
    String s1 = "Stack Overflow";
    String s2 = "Stack Overflow";
    s1 == s2;      //true
    s1.equals(s2); //true
    
    Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле.
  • Случай 2
    String s1 = new String("Stack Overflow");
    String s2 = new String("Stack Overflow");
    s1 == s2;      //false
    s1.equals(s2); //true
    
    Причина. Если вы создаете объект String с использованием ключевого слова new, ему выделяется отдельное пространство в куче.
13
задан Vlad Gudim 3 November 2008 в 11:29
поделиться

6 ответов

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

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

8
ответ дан mackenir 3 November 2008 в 11:29
поделиться

Здесь прибывает ответ из GOF:

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

7
ответ дан Özgür 3 November 2008 в 11:29
поделиться

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

'Шаблон "команда"' является шаблоном разработки.
функтор является одним способом реализовать 'Шаблон "команда"'.

18
ответ дан Martin York 3 November 2008 в 11:29
поделиться

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

3
ответ дан marijne 3 November 2008 в 11:29
поделиться

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

<час>

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

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

  • программирование в функциональном стиле
  • функции высшего порядка
  • внутренние итераторы
  • повторное использование и специализация через состав, а не наследование и перегрузку
  • универсальные API "обратного вызова" или "точки расширения"
  • универсальные "фильтры" или API предиката
  • много "поведенческих" шаблонов разработки, таких как Посетитель, Стратегия, Цепочка Ответственности, и т.д.
5
ответ дан mkoeller 3 November 2008 в 11:29
поделиться
  • 1
    Ничего себе, это - бомба. Действительно ли Вы знакомы с d3? Вы были бы в состоянии обернуть это в d3 расположение. Я уже наградил щедрость, поскольку время заканчивалось, я wasn' t ожидание больше отвечает настолько поздно на. I' ll делают другую щедрость на следующей неделе и присуждают ее Вам. Спасибо за бросание взгляда времени на это. – cerberos 7 February 2014 в 17:19

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

языку А с закрытиями не нужен Шаблон "команда".

3
ответ дан Steve McLeod 3 November 2008 в 11:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: