2008-11-03 13 views
11

Estoy muy familiarizado con el patrón Command, pero aún no entiendo la diferencia en teoría entre un Functor y un comando. En particular, estoy pensando en implementaciones de Java. Ambos son básicamente "verbos" de programación representados como objetos. Sin embargo, en el caso de los funtores, como he visto en algunos ejemplos, las implementaciones anónimas de la clase interna parecen comunes. ¿Puede alguien por ahí aclararme esto amablemente?¿Cuál es la diferencia entre un Functor y el patrón Command?

Respuesta

7

Un functor es un concepto de 'nivel sintáctico' - empaqueta código en un objeto que puede tratarse sintácticamente como un puntero a función - es decir, puede 'invocarse' poniendo la lista de parámetros entre paréntesis. En C++, puede hacer que una clase sea un funcionador anulando operador().

Un comando en el patrón de comando es un objeto que empaqueta algunas funcionalidades ejecutables, pero no es necesario que sea un funtor. Por ejemplo, podría ser una clase que implemente una interfaz ICommand, permitiendo que su comando se ejecute llamando a Do().

+3

Vale la pena señalar que se podría usar un functor para implementar el patrón de comando. La mayoría de los programadores orientados a objetos elegirían un objeto que implementa una interfaz de comando, sin embargo. –

5

partir de la descripción de la página Apache Commons Functor:


un funtor es una función que puede ser manipulado como un objeto, o un objeto que representa una sola función, genérico.

Functors apoyar y fomentar un número de técnicas de programación potentes incluyendo:

  • programación en un estilo funcional
  • superior funciones de orden
  • iteradores internos
  • de reutilización y de especialización través de la composición en lugar de la herencia y sobrecarga
  • API genéricas de "devolución de llamada" o "punto de extensión"
  • genéricos "filtros" o APIs predicados
  • muchos patrones de diseño "comportamiento", como visitante, Estrategia, Cadena de Responsabilidad, etc.
16

Un funtor es una implementación, una manera de hacer que un objeto se comporta como Una función.

El 'Patrón de comando' es un patrón de diseño.
El functor es una forma de implementar el 'Patrón de comando'.

+1

@Martin York: Es posible que desee agregar "Marketing": el comando tiene una mejor comercialización que "Functor". –

3

Creo que un functor es un componente del patrón de comando, que también involucra a otra infraestructura, como el invocador y los destinatarios del comando.

3

El patrón de comando se utiliza en Java porque no tenemos cierres en Java. Functors es un intento de implementar cierres.

Un idioma con cierres no necesita el patrón de comando.

+3

Probablemente sería más justo decir que (algunas formas de) el patrón de comando se puede implementar mucho más fácilmente usando cierres. (Y si el comando admite deshacer, por ejemplo, necesita algo más que un cierre para implementarlo). – JacquesB

6

Aquí viene la respuesta de la GOF:

Coplien describe cómo implementar funtores, objetos que son funciones, en C++ [Cop92].Obtiene un grado de transparencia en su uso por sobrecargando el operador de llamada a función (operador()). El patrón de comando es diferente; su atención se centra en mantener una unión entre un receptor y una función de (es decir, la acción), no sólo el mantenimiento de una función.

4

De acuerdo con la definición citada de GOF (Gang of Four) (por Comptrol), Functor y Command son dos patrones diferentes.

Como ya se ha mencionado, Functor representa una Clase que contiene un método de servicio, en otros términos: la principal responsabilidad de la clase de functor es almacenar la lógica específica implementada en su propio método. Por lo tanto, podemos pensar en el functor cómo un contenedor para la lógica interna de su propio método. Históricamente, Functor nace porque en la especificación de Java no está presente la implementación y/o el concepto de 'puntero de función', que es muy útil en el contexto de devoluciones de llamada registradas (implementación específica para el patrón de observador).

El patrón de comando representa un patrón de diseño destinado a desacoplar una entidad Invoker de una receptora. Se usa principalmente cuando se necesita para decuplicar las acciones (generar los eventos) de los oyentes de acción (pensar en GUI). Tiene un método responsable de la ejecución de una operación específica (dependiendo de la implementación del comando particular de su propia superclase) que se refiere a un Receptor de objetos específico; en la definición establecida, el método de ejecución se puede definir como "no inteligente", de hecho, con una implementación inteligente podría ser él mismo implementar la lógica operativa en lugar de delegarla en un tercer objeto. Cuando tenemos un método de ejecución inteligente, estamos implementando un funtor, y estamos poniendo el funtor (implementación de subparte de comando específico) en el contexto del patrón de comando.

Espero que esto sea útil para usted.

Cuestiones relacionadas