En el trabajo, estamos desarrollando una aplicación PHP que luego se volvería a programar en Java. Con algunos conocimientos básicos de Java, estamos tratando de diseñar todo para ser fácilmente reescrito, sin ningún tipo de dolores de cabeza. Surgió un problema interesante cuando intentamos implementar composite pattern con una gran cantidad de métodos en hojas.Problema de métodos de hoja múltiple en el patrón compuesto
¿Qué estamos tratando de lograr (no el uso de interfaces, es sólo un ejemplo rápido):
class Composite {
...
}
class LeafOne {
public function Foo();
public function Moo();
}
class LeafTwo {
public function Bar();
public function Baz();
}
$c = new Composite(Array(new LeafOne(), new LeafTwo()));
// will call method Foo in all classes in composite that contain this method
$c->Foo();
// same with Bar
$c->Bar();
Parece como patrón Composite clásico más o menos, pero el problema es que vamos a tener bastante muchas clases de hojas y cada uno de ellos podría tener ~ 5 métodos (de los cuales pocos podrían ser diferentes a otros). Una de nuestras soluciones, que parece ser la mejor hasta ahora y podría funcionar, es usar __call magic method para llamar a métodos en hojas. Desafortunadamente, no sabemos si existe un equivalente en Java.
Así que la verdadera pregunta es: ¿hay una mejor solución para esto, utilizando un código que eventualmente sería reconfigurado fácilmente en Java? ¿O recomiendas otra solución? Tal vez haya un patrón diferente y mejor que podría usar aquí.
En caso de que haya algo poco claro, solo pregunte y voy a editar esta publicación.
Editar:
problema real es que no todas las clases de hoja contiene, por ejemplo, el método de Baz. Si utilizáramos foreach simple para llamar a Baz en cada clase, daría lugar a un montón de errores, ya que hay ciertas clases que no contienen este método. La solución clásica sería tener todos los métodos de cada clase de hoja implementados en clase compuesta, cada uno con una implementación diferente. Pero esto haría que nuestra clase compuesta fuera enorme y desordenada con la cantidad de métodos que usamos.
solución tan habitual sería el siguiente (clase Compuesto):
class Composite implements Fooable, Bazable {
...
public function Foo() {
foreach($this->classes as $class) {
$class->Foo();
}
}
public function Baz() {
...
}
}
Para evitar que nuestro código para que sea verdadero desastre, estábamos pensando en algo como:
class Composite {
...
public function __call() {
// implementation
}
}
Pero nosotros aren' t realmente seguro si es una buena solución y si hay algo similar también en Java (como se preguntó antes de editar).
Por favor describa mejor el problema. El patrón compuesto es para interactuar con objetos múltiples como si fueran uno o lo mismo, independientemente de la estructura que compongan. ¿Qué quieres lograr usando un patrón compuesto? –
Estaría realmente interesado en ver por qué no lo estás haciendo en Java desde el principio. –
@Gabriel: Editado. Espero eso ayude. @Ionut: Burocracia :) –