Hay varias maneras de abordar este problema. La mayoría de estos fueron ya publicados:
- Commands - llevar un montón de objetos que tienen un execute() o invocar() en un mapa; busca el comando por nombre, luego invoca el método.
- Polymorphism - Más en general que los comandos, puede invocar métodos en cualquier conjunto relacionado de objetos.
- Finalmente hay reflexión: puede usar la reflexión para obtener referencias a los objetos java.lang.Method. Para un conjunto de clases/métodos conocidos, esto funciona bastante bien y no hay demasiada sobrecarga una vez que carga los objetos del Método. Puede usar esto para, por ejemplo, permitir que un usuario escriba código Java en una línea de comando, que ejecuta en tiempo real.
Personalmente, utilizaría el enfoque Comando. Los comandos se combinan bien con Template Methods, lo que le permite aplicar ciertos patrones en todos sus objetos de comando. Ejemplo:
public abstract class Command {
public final Object execute(Map<String, Object> args) {
// do permission checking here or transaction management
Object retval = doExecute(args);
// do logging, cleanup, caching, etc here
return retval;
}
// subclasses override this to do the real work
protected abstract Object doExecute(Map<String, Object> args);
}
Me recurrir a la reflexión sólo cuando es necesario utilizar este tipo de mapeo de clases cuyo diseño no se controla, y para el cual no es práctico para hacer comandos. Por ejemplo, no podría exponer la API de Java en un comando-shell haciendo comandos para cada método.
Específicamente suena como el patrón Estrategia (http://en.wikipedia.org/wiki/Strategy_pattern#Java) podría ayudar aquí (no tan corto como el equivalente de Python, pero ...). – Gadi
¿Cómo hacer esto por polimorfismo? La función que se debe involucrar se basa en la información del cliente. ¿Podrías mostrarme? Gracias. – Ross